module HaveAPI::Fs::Components
  class IndexFilter < Directory
    component :index_filter
    attr_reader :resource_dir, :param, :filters

    def initialize(resource_dir, param, filters = {})
      super()

      @resource_dir = resource_dir
      @param = param
      @filters = filters
    end

    def title
      "Filter by #{@param}"
    end

    protected
    def new_child(value)
      if child = super
        child
      
      else
        f = @filters.clone
        f[ @param ] = value.to_s
        [IndexFilterValue, @resource_dir.resource, f]
      end
    end
  end

  class IndexFilterValue < ResourceDir
    component :resource_dir
    help_file :resource_dir

    def initialize(resource, filters)
      super(resource)

      @filters = filters
    end

    def setup
      super

      @filters.each do |k, v|
        @index.find(:input).find(k).write(v)
        @last = v
      end
    end

    def title
      @last.to_s
    end

    protected
    def new_child(name)
      child = super(name)
      return child unless child

      child << @filters.clone if [child].flatten.first == IndexFilter
      child
    end
  end
end