module Puffer
  module Controller
    module Generated

      def self.included base
        base.class_eval do
          extend ClassMethods
        end
      end

      module ClassMethods

        def generate_association_actions field
          field.collection? ? generate_collection_association_actions(field) : generate_single_association_actions(field)
        end

        def generate_single_association_actions field
          define_method "associated_#{field}_choosing" do
            @field = field
            @record = resource.member if params[:id]
            @records = field.reflection.klass.includes(field.association_columns.includes).where(field.association_columns.searches(params[:search])).limit(100).all
            render 'puffer/associated/one'
          end

          collection do
            get "associated_#{field}_choosing", :display => false
          end
        end

        def generate_collection_association_actions field
          define_method "associated_#{field}" do
            @record = resource.member
            @records = field.association.klass.scoped(:conditions => {:id => params[:ids]}).scoped(:conditions => search_query(field.association_fields)).paginate(:page => params[:page], :include => includes(field.association_fields))
            @field = field
            render 'puffer/associated/many'
          end

          define_method "associated_#{field}_choosing" do
            @record = resource.member
            @records = field.association.klass.scoped(:conditions => search_query(field.association_fields)).paginate(:page => params[:page], :include => includes(field.association_fields))
            @choosen = field.association.klass.scoped(:conditions => {:id => params[:ids]}).scoped(:conditions => search_query(field.association_fields)).paginate(:page => params[:page], :include => includes(field.association_fields))
            @field = field
            render 'puffer/associated/many'
          end

          collection do
            get "associated_#{field}", :display => false
            get "associated_#{field}_choosing", :display => false
          end
        end

        def generate_change_actions field
          define_method "toggle_#{field}" do
            @record = model.find params[:id]
            @field = field
            @record.toggle! field.name.to_sym
            render 'puffer/toggle'
          end
        end

      end

    end
  end
end