# This is a common set of Formtastic overrides needed to build a filter form
# that lets you select from a set of search methods for a given attribute.
#
# Your class must declare available filters for this module to work.
# Those filters must be recognizable by Ransack. For example:
#
#   class NumericInput < ::Formtastic::Inputs::NumberInput
#     include Base
#     include Base::SearchMethodSelect
#
#     filter :equals, :greater_than, :less_than
#   end
#
module ActiveAdmin
  module Inputs
    module Filters
      module Base
        module SearchMethodSelect

          def self.included(base)
            base.extend ClassMethods
          end

          module ClassMethods
            attr_reader :filters

            def filter(*filters)
              (@filters ||= []).push *filters
            end
          end

          def wrapper_html_options
            opts = super
            (opts[:class] ||= '') << ' select_and_search' unless seems_searchable?
            opts
          end

          def to_html
            input_wrapping do
              label_html  << # your label
              select_html << # the dropdown that holds the available search methods
              input_html     # your input field
            end
          end

          def input_html
            builder.text_field current_filter, input_html_options
          end

          def select_html
            template.select_tag '', template.options_for_select(filter_options, current_filter)
          end

          def filters
            options[:filters] || self.class.filters
          end

          def current_filter
            @current_filter ||= begin
              methods = filters.map{ |f| "#{method}_#{f}" }
              methods.detect{ |m| @object.public_send m } || methods.first
            end
          end

          def filter_options
            filters.collect do |filter|
              [I18n.t("active_admin.filters.predicates.#{filter}"), "#{method}_#{filter}"]
            end
          end

        end
      end
    end
  end
end