<% if namespaced? -%>
require_dependency "<%= namespaced_path %>/application_controller"

<% end -%>
<% module_namespacing do -%>
class <%= controller_class_name %>Controller < ApplicationController

  before_action :authorize
  before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]

  def index
    @query = <%= class_name %>.query.new(self)
    @entities = @query.entities
    respond_to do |format|
      format.html do
        @entities = @entities.page(params[:page])
        render layout: !request.xhr?
      end
      format.json { render json: @entities.all, only: %i(id)+<%= class_name %>.registered_attributes.keys }
      format.xml { render xml: @entities.all, only: %i(id)+<%= class_name %>.registered_attributes.keys }
    end
  end

  def show
    respond_to do |format|
      format.html
      format.json { render json: @<%= singular_table_name %> }
      format.xml { render xml: @<%= singular_table_name %> }
    end
  end

  def new
    @<%= singular_table_name %> = <%= orm_class.build(class_name) %>
    respond_to do |format|
      format.html
      format.js
    end
  end

  def edit
    respond_to do |format|
      format.html
      format.js
    end
  end

  def create
    @<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %>
    respond_to do |format|
      if @<%= orm_instance.save %>
        format.html { redirect_to @<%= singular_table_name %>, notice: t(:text_created) }
        format.json { render json: @<%= singular_table_name %>, status: :created, location: @<%= singular_table_name %> }
        format.xml { render xml: @<%= singular_table_name %>, status: :created, location: @<%= singular_table_name %> }
      else
        format.html { render :new }
        format.json { render json: @<%= singular_table_name %>.errors, status: :unprocessable_entity }
        format.xml { render xml: @<%= singular_table_name %>.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @<%= orm_instance.update("#{singular_table_name}_params") %>
        format.html { render(:edit, notice: t(:text_updated)) }
        format.any(:json, :xml) { head(:no_content) }
      else
        format.html { render(:edit) }
        format.json { render(json: @<%= singular_table_name %>.errors, status: :unprocessable_entity) }
      end
    end
  end

  def destroy
    @<%= orm_instance.destroy %>

    respond_to do |format|
      format.html { redirect_back_or_default <%= index_helper %>_path, notice: t(:text_destroyed) }
      format.js { render js: "Symphonia.filters.removeRow('#{view_context.dom_id(@<%= singular_table_name %>)}')"}
      format.any(:json, :xml) { head :no_content }
    end
  end

  private
  # Use callbacks to share common setup or constraints between actions.
  def set_<%= singular_table_name %>
    @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
  end

    # Only allow a trusted parameter "white list" through.
  def <%= "#{singular_table_name}_params" %>
  <%- if attributes_names.empty? -%>
    params.fetch(:<%= singular_table_name %>, {})
  <%- else -%>
    allowed = [<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>]
    params.require(:<%= singular_table_name %>).permit(allowed)
  <%- end -%>
  end
end
<% end -%>