{% assign model = include.model %} {% assign namespace = include.namespace %}

{% assign tab = 0 %} {% capture namespace_modules %}{% for n in namespace %} {{ tab | indent }}module {{ n | camelcase }}{% assign tab = tab | plus:1 %}{% endfor %}{% endcapture %}

# frozen_string_literal: true

{{ namespace_modules }}{% capture _ %}{% increment tab %}{% endcapture %}
{{ tab | indent  }}# {{ model.db_name | capitalize }} controller{% assign tab = tab + '  ' %}
{{ tab | indent  }}class {{ model.db_name | camelcase }}Controller < BaseController
      resource_description do
        short '{{ model.db_name | capitalize }}'
        deprecated false
        description <<-DES
          {{ model.db_name | capitalize }} resource.
        DES
      end

      before_action :set_{{ model.name}}, except: [:index, :create]

      api :GET, '/{{ model.db_name }}', 'See {{ model.db_name }}'
      returns code: 200, desc: '{{ model.name | capitalize }} details' do
        property :status, String, desc: '200'
        property :message, String, desc: '{{ model.db_name | capitalize }} details'
        property :data, Hash, desc: '{{ model.db_name | capitalize }} data' do
          property :page, Integer
          property :total, Integer
          property {{ model.db_name }}, Array do{% for field in model.fields %}
            property :{{ field.name }}, {{ field.type | camelcase }}{% endfor %}
            property :created_at, DateTime
            property :updated_at, DateTime
          end
        end
      end
      example <<-DES
      # Request:
      [GET] /{{ model.db_name }}/{:id}
      DES
      def index
        # TODO: Pagination and filters
        @{{ model.db_name }} = {{ model.name | camelcase }}.all
        send_response(200, 'List of {{ model.db_name | capitalize }}', nil, ActiveModel::Serializer::CollectionSerializer.new(@{{ model.db_name }}, serializer: {{ model.name | camelcase }}Serializer))
      end

      api :GET, '/{{ model.db_name }}/:id', 'See {{ model.name }} details'
      param :id, String, desc: 'ID of the invitation', required: true
      error code: 404, desc: 'NOT_FOUND'
      returns code: 200, desc: '{{ model.name | capitalize }} details' do
        property :status, String, desc: '200'
        property :message, String, desc: '{{ model.name | capitalize }} details'
        property :data, Hash, desc: '{{ model.name | capitalize }} data' do{% for field in model.fields %}
          property :{{ field.name }}, {{ field.type | camelcase }}{% endfor %}
          property :created_at, DateTime
          property :updated_at, DateTime
        end
      end
      example <<-DES
      # Request:
      [GET] /{{ model.db_name }}/{:id}
      DES
      def show
        send_response(200, '{{ model.name | capitalize }} details', nil, {{ model.name | camelcase }}Serializer.new(@{{ model.name }}))
      end

      api :POST, '/{{ model.db_name }}', 'Create {{ model.name }}'
      error code: 422, desc: 'RESOURCE_NOT_VALID'
      returns code: 200, desc: '{{ model.name | capitalize }} details' do
        property :status, String, desc: '200'
        property :message, String, desc: '{{ model.name | capitalize }} details'
        property :data, Hash, desc: '{{ model.name | capitalize }} data' do{% for field in model.fields %}
          property :{{ field.name }}, {{ field.type | camelcase }}{% endfor %}
          property :created_at, DateTime
          property :updated_at, DateTime
        end
      end
      example <<-DES
      # Request:
      [GET] /{{ model.db_name }}/{:id}
      DES
      def create
        # Add strong params
        @{{ model.name }} = {{ model.name | camelcase }}.new({{ model.name }}_params)
        if @{{ model.name }}.save
          send_response(200, '{{ model.name | capitalize }} details', nil, {{ model.name | camelcase }}Serializer.new(@{{ model.name }}))
        else
          send_response(422, '{{ model.name | capitalize }} error', 'RESOURCE_NOT_VALID', @{{ model.name }}.errors))
        end
      end

      api :PUT, '/{{ model.db_name }}/:id', 'Update {{ model.name }}'
      param :id, String, desc: 'ID of the invitation', required: true
      error code: 403, desc: 'RESOURCE_NOT_VALID'
      error code: 404, desc: 'NOT_FOUND'
      returns code: 200, desc: '{{ model.name | capitalize }} details' do
        property :status, String, desc: '200'
        property :message, String, desc: '{{ model.name | capitalize }} details'
        property :data, Hash, desc: '{{ model.name | capitalize }} data' do{% for field in model.fields %}
          property :{{ field.name }}, {{ field.type | camelcase }}{% endfor %}
          property :created_at, DateTime
          property :updated_at, DateTime
        end
      end
      example <<-DES
      # Request:
      [GET] /{{ model.db_name }}/{:id}
      DES
      def update
        # Add strong params
        @{{ model.name }} = {{ model.name | camelcase }}.assign_attributes({{ model.name }}_params)
        if @{{ model.name }}
          if @{{ model.name }}.save
            send_response(200, '{{ model.name | capitalize }} updated', nil, {{ model.name | camelcase }}Serializer.new(@{{ model.name }}))
          else
            send_response(403, '{{ model.name | capitalize }} error', 'RESOURCE_NOT_VALID', @{{ model.name }}))
          end
        else
          send_response(404, '{{ model.name | capitalize }} not found', 'NOT_FOUND', nil))
        end
      end

      api :DELETE, '/{{ model.db_name }}/:id', 'Delete {{ model.name }}'
      param :id, String, desc: 'ID of the invitation', required: true
      error code: 403, desc: 'RESOURCE_NOT_VALID'
      error code: 404, desc: 'NOT_FOUND'
      returns code: 200, desc: '{{ model.name | capitalize }} details' do
        property :status, String, desc: '200'
        property :message, String, desc: '{{ model.name | capitalize }} details'
        property :data, Hash, desc: '{{ model.name | capitalize }} data' do{% for field in model.fields %}
          property :{{ field.name }}, {{ field.type | camelcase }}{% endfor %}
          property :created_at, DateTime
          property :updated_at, DateTime
        end
      end
      example <<-DES
      # Request:
      [GET] /{{ model.db_name }}/{:id}
      DES
      def destroy
        if @{{ model.name }}
          if @{{ model.name }}.destroy
            send_response(200, '{{ model.name | capitalize }} deleted', nil, {{ model.name | camelcase }}Serializer.new(@{{ model.name }}))
          else
            send_response(403, '{{ model.name | capitalize }} error', 'RESOURCE_NOT_VALID', @{{ model.name }}.errors))
          end
        else
          send_response(404, '{{ model.name | capitalize }} not found', 'NOT_FOUND', nil))
        end
      end

      private

      def set_{{ model.name }}
        @{{ model.name }} = {{ model.name | camelcase }}.find(params['id'])
      end

      def {{ model.name }}_params
        params.require({{model.name}}).permit({% for f in model.fields %}:{{f.name}},{% endfor %})
      end

    end
  end
end