class SearchPresenter
  include ActionView::Helpers::NumberHelper
  include ActionView::Helpers::UrlHelper

  private

  attr_reader :params, :query

  public

  def initialize(query: nil, results: [], params: {})
    if query
      @query = query
    else
      @query = SearchQuery.new(params)
    end

    @params = params
    @results_by_class = results
  end

  def paginated_results
    paginated_results_for(query.content_item_type) # => ActiveRecord::Relation
  end

  def results
    paginated_results_for(query.content_item_type).map do |model|
      SearchResultPresenter.new(model, query.searched_topic_id)
    end
  end

  def results_for(content_item_type)
    @results_by_class[content_item_type] # => ActiveRecord::Relation
  end

  def paginated_results_for(content_item_type)
    results_for(content_item_type).paginate(page: query.page) # => ActiveRecord::Relation
  end

  def count_for(content_item_type)
    if query.action == 'contributed_by'
      # distinct statments in Content's SQL break arel's count.
      @results_by_class[content_item_type].size # => Fixnum
    else
      @results_by_class[content_item_type].count # => Fixnum
    end
  end

  def link_path_params_for(content_item_type)
    {
      controller: @query.controller,
      action: @query.action,
      params: query_params_for(content_item_type)
    }
  end

  # TODO: should this be renamed url_safe_basket_name ??
  # EOIN: it's not clear whether this it he basket within which we are
  #       searching or the basket we are currently displaying
  def urlified_basket_name
    params[:urlified_name]
  end

  def date_since
    query.date_since # unless clear_values
  end

  def date_until
    query.date_until # unless clear_values
  end

  def extended_field
    params[:extended_field]
  end

  def limit_to_choice
    params[:limit_to_choice]
  end

  def view_as_choice_heirarchy?
    view_as == 'choice_hierarchy'
  end

  def view_as
    # map|choice_heirarchy
    params[:view_as]
  end

  def view_as_map?
    view_as == 'map'
  end

  def topic_type
    ''
  end

  def pagination_link_params
    query.pagination_link_params
  end

  def action
    # EOIN: this is heinous but Search.all_sort_types needs to be changed to fix it
    'for'
  end

  def category_columns
    browse_by_category_columns
  end

  def result_sets
    sets = {}
    content_item_types.map do |content_type|
      sets[content_type] = []
    end
    sets
  end

  def clear_values
    false
    # seems to be a flag that says whether the html form should have empty values
    # expects a boolean
  end

  def extended_field
    # expects a thing that implements #label
    OpenStruct.new(label: 'some label')
  end

  def title
    query.to_title
  end

  def current_basket
    Basket.site_basket # FIXME: make this find the basket the user is ucrrently in
  end

  def help_basket
    Basket.help_basket
  end

  def site_basket
    Basket.site_basket
  end

  def about_basket
    Basket.about_basket
  end

  def documentation_basket
    Basket.documentation_basket
  end

  def standard_baskets
    Basket.standard_basket_ids
  end

  def current_privacy
    default = current_basket.private_default_with_inheritance? ? 'private' : 'public'
    display_menu = true # EOIN: TODO: this method needs to be cleaned up
    ((params[:privacy_type] unless clear_values) || (SystemSetting.default_search_privacy if display_menu) || default)
  end

  def content_item_types
    # EOIN: these used to be called ZOOM_CLASSES
    # EOIN: TODO: not clear where we should pull this from yet
    %w(Topic StillImage AudioRecording Video WebLink Document)
  end

  def content_item_type_to_tab_nav_name(content_item_type)
    mapping = {
      'Topic' => 'Topics',
      'StillImage' => 'Images',
      'AudioRecording' => 'Audio',
      'Video' => 'Video',
      'WebLink' => 'Web links',
      'Document' => 'Documents',
    }
    mapping[content_item_type] || 'Unknown content_item_type'
  end

  def search_sources_amount
    # FIXME: this model comes from a rails plugin in old kete
    # SearchSource.count(:conditions => ["source_target IN (?)", ['all', 'search']])
    0
  end

  def number_per_page
    10
  end

  def current_content_item_type
    query.content_item_type
  end

  def selected_content_item_type
    query.content_item_type
  end

  def sort_type_options_for(*args)
  end

  def basket_link
    basket_link = search_link_to_searched_basket
    t('search.for.whole_site') if basket_link.nil?
  end

  def search_terms_are_present?
    query.search_terms.present?
  end

  def search_terms
    query.search_terms
  end

  def link_to_add_item(options = {})
    # phrase = options[:phrase]
    # item_class = options[:item_class]

    # phrase += ' ' + content_tag('span', zoom_class_humanize(item_class), :class => 'current_zoom_class')

    # if @current_basket != @site_basket
    #   phrase += t('application_helper.link_to_add_item.in_basket',
    #               :basket_name => @current_basket.name)
    # end

    # return link_to(phrase, {:controller => zoom_class_controller(item_class), :action => :new}, :tabindex => '1')
    ''
  end

  def topic_type_useful_here?(type)
    # display_search_field_for?(type, SystemSetting.display_topic_type_field) || params[:controller_name_for_zoom_class] == 'topics'
    true
  end

  def search_results_info_and_links
    #   statement, links = Array.new, Array.new

    #   statement << t('search.results.showing_x-y_of_z',
    #                 :start => @start, :finish => @end_record,
    #                 :total => @result_sets[@current_class].size)

    #   links << '<div id="refine_search_dropdown_trigger"></div>'

    #   if @number_of_locations_count && @number_of_locations_count > 0
    #     statement << t('search.results.x-y_have_z_locations',
    #                    :start => @start, :finish => @end_record,
    #                    :n_locations => @number_of_locations_count)
    #     if params[:view_as] != 'map' && SystemSetting.enable_maps?
    #       links << link_to(t('search.results.view_map'), { :overwrite_params => { :view_as => 'map' } }, { :tabindex => '1' } )
    #     elsif params[:view_as] == 'map'
    #       links << link_to(t('search.results.view_list'), { :overwrite_params => { :view_as => nil } }, { :tabindex => '1' } )
    #     end
    #   end

    #   statement.join(', ') + " [ " + links.join(' | ') + " ] "
    ''
  end

  def query_params_for(content_item_type)
    query.query_params_for(content_item_type)
  end

  def link_text_for(content_item_type)
    count = count_for(content_item_type)
    text = content_item_type_to_tab_nav_name(content_item_type)
    "#{text} (#{number_with_delimiter(count)})"
  end

  private

  def search_link_to_searched_basket
    # html = String.new
    # html += ' ' + link_to_index_for(@current_basket, { :class => 'basket' }) if @current_basket != @site_basket
    ''
  end

  def title_setup_first_part(title_so_far, span_around_zoom_class = false)
    # if @current_basket != @site_basket
    #   title_so_far += @current_basket.name + ' '
    # end
    # zoom_class = zoom_class_from_controller(@controller_name_for_zoom_class)
    # zoom_class_humanized = zoom_class_plural_humanize(zoom_class).downcase
    # title_so_far += span_around_zoom_class \
    #                   ? content_tag('span', zoom_class_humanized, :class => 'current_zoom_class') \
    #                   : zoom_class_humanized
    'the title'
  end

  def last_part_of_title_if_refinement_of(add_links = true)
    # end_of_title_parts = Array.new

    # end_of_title_parts << t('search_helper.last_part_of_title_if_refinement_of.about_a', :topic_type_name => @topic_type.name) if !@topic_type.nil?

    # if @tag.present?
    #   tag_link = link_to(@tag.name, { :controller => 'tags', :action => 'show', :id => @tag }, tag_show_link_options(@tag))
    #   end_of_title_parts << t('search_helper.last_part_of_title_if_refinement_of.tagged_as', :tag_name => tag_link)
    # end

    # if !@contributor.nil?
    #   contributor = add_links ? link_to_profile_for(@contributor, nil, contributor_show_link_options(@contributor)) : @contributor.user_name
    #   contributor_string = t('search_helper.last_part_of_title_if_refinement_of.contributed_by', :contributor => contributor)
    #   contributor_string += ' ' + avatar_for(@contributor) if SystemSetting.enable_user_portraits? || SystemSetting.enable_gravatar_support?
    #   end_of_title_parts << contributor_string
    # end

    # unless @limit_to_choice.nil?
    #   end_of_title_parts << "#{@extended_field ? t('search_helper.last_part_of_title_if_refinement_of.extended_field', :field_name => @extended_field.label.singularize.downcase) : ''}
    #                                              #{t('search_helper.last_part_of_title_if_refinement_of.limit_to_choice', :choice => @limit_to_choice.label)}"
    # end

    # unless @source_item.nil?
    #   @source_item.private_version! if permitted_to_view_private_items? && @source_item.latest_version_is_private?
    #   end_of_title_parts << t('search_helper.last_part_of_title_if_refinement_of.related_to', :source_item => link_to_item(@source_item))
    # end

    # end_of_title_parts << t('search_helper.last_part_of_title_if_refinement_of.date_since', :date => @date_since) unless @date_since.nil?
    # end_of_title_parts << t('search_helper.last_part_of_title_if_refinement_of.date_until', :date => @date_until) unless @date_until.nil?

    # end_of_title_parts << t('search_helper.last_part_of_title_if_refinement_of.privacy_type', :privacy => @privacy) if !@privacy.nil?

    # end_of_title = end_of_title_parts.join(t('search_helper.last_part_of_title_if_refinement_of.and'))
    ''
  end
end
