module Filternator
  class Filter

    attr_reader :scope, :scope_name, :presenter, :all_filters, :default_filter

    def initialize(options = {})
      @scope          = options.fetch(:scope)
      @scope_name     = options.fetch(:scope_name)     { derive_scope_name }
      @presenter      = options.fetch(:presenter)      { null_presenter }
      @all_filters    = options.fetch(:all_filters)    { scope.all_filters }
      @default_filter = options.fetch(:default_filter) { "all" }
    end

    def stats
      Hash[ all_filters.map { |filter| [ filter, apply(filter: filter).count ] } ]
    end

    def apply(params)
      ApplyFilter.new(self, params)
    end

    private

    def derive_scope_name
      scope.model_name.element.pluralize
    end

    def null_presenter
      lambda { |item| item }
    end

  end
end