class HomeController < ApplicationController

  before_action :load_cached_search_params, only: [:index, :feed]
  skip_before_action :login_required, only: [:feed, :show_light_boxe]
  before_action :feed_basic_authentication, only: [:feed, :show_light_boxe]

  def index
    @current_params = params[:form_current_params] && Pixways.valid_json(params[:form_current_params]) ? JSON.parse(params[:form_current_params]).with_indifferent_access : @current_params

    val_def_ppage = @current_params["default_per_page"].to_i
    val_def_since = @current_params["search_since"]
    val_def_sort = @current_params["sort"]
    val_def_media = @current_params["media_typ"]
    # @show_facet = 1
    @show_facet = params[:search].blank? ? 0 : 1
    update_pos_img(params[:ids]) if params[:ids]
    u = current_user
    @scroll_medias = u.setting.pagination

    val_def_ppage = u.setting.default_per_page.blank? || u.setting.default_per_page == 0 ? NB_PER_PAGE : u.setting.default_per_page if val_def_ppage == 0
    u.setting.update_attribute(:default_per_page, val_def_ppage) unless val_def_ppage == u.setting.default_per_page

    if params[:search].blank? && @current_params["search_since"].blank?
      @current_params["search_since"] = 'all'
      u.setting.default_since = 'All'
      if session[:pixtech] && !session[:pixtech].blank? && !session[:pixtech_author].blank?
        session[:pixtech_author].each do |p|
          @current_params["providers"][p.to_s] = 1
        end
      end
    else
      u.setting.update_attribute(:default_since, val_def_since) unless u.setting.default_since == val_def_since
    end

    if Server.itself?(VINGTMINUTES_SERVER_NAME)
      @providers = Provider.where(id: session[:provs]).order(:name_order)
      @nbafp = Statistic.joins(:image).where('statistics.created_at > ? and images.provider_id = ?', "#{Time.new.strftime('%Y-%m')}-01 00:00", Provider.find_by_string_key('20min_Afp').id).count
    else
      @providers = Provider.where(id: session[:provs]).order(:name)
    end
    @pw_providers = @providers.where(provider_type_id: 1, local: false)
    @local_providers = @providers.where(provider_type_id: 1, local: true)
    @photographer_providers = @providers.where(provider_type_id: 2).reorder(:pixtech_id, :pp_string_key, :name)

    @t_entries = 0

    @image_fields = [[I18n.t(:headline),:headline],[I18n.t(:description),:description],[I18n.t(:rights),:rights],[I18n.t(:credit),:credit],
                     [I18n.t('source',provider_word: I18n.t(session[:provider_word], count: 1)).capitalize,:source],
                     [I18n.t(:instructions),:instructions],[I18n.t(:state),:state],[I18n.t(:object_name),:title],
                     [I18n.t(:category),:category],[I18n.t(:supplemental_category),:supplemental_category],
                     [I18n.t(:original_filename),:original_filename],[I18n.t(:file_name,service_name:session[:service_name]),:file_name],
                     [I18n.t(:normalized_credit),:normalized_credit],[I18n.t(:reportage),:reportage]]
    @displayed_image_fields = {}
    @current_params.each do |k,v|
      @displayed_image_fields[k] = v if (!v.blank? && Image.searchable_fields.include?(k.to_sym))
    end

    if Pixways.get_pixtech_param_value(session[:pixtech],'pixtech_only')=='true'
      @flow_select = [[I18n.t('all'), 'all'], ['Sur PixTech', 'pp1'], ['Pas sur PixTech', 'not_pp1']]
    elsif session[:pixtech]=='parismatch'
      @flow_select = [[I18n.t('flow_parismatch_all'), 'all'], [I18n.t('flow_parismatch_none'), 0], [I18n.t('flow_parismatch_private'), '3,4,5'], [I18n.t('flow_parismatch_public'), '6,7,8'], ['PixPalace', '4,7'], ['PP2', '5,8'], [I18n.t('flow_parismatch_unaffected'), 10]]
    else
      @flow_select = [[I18n.t('all'), 'all'], ['Sur PP1', 'pp1'], ['Pas sur PP1', 'not_pp1'], ['Sur PP2', 'pp2'], ['Pas sur PP2', 'not_pp2'], ['Aucun', 'none']]
    end

    if params[:request_to_provider_id]
      rtp = RequestToProvider.find(params[:request_to_provider_id])
      @medias = rtp.images.page(1).per(rtp.responses_count)
      @t_entries = @medias.total_count
      @show_facet = 0
    else
      unless params[:pp_params].blank?
        firstsplit = []
        firstsplit = params[:pp_params].split('@@@')
        @current_params = {}
        firstsplit.each do |v|
          unless v.blank?
            tab = []
            tab = v.split('$$$')
            @current_params[tab[0].to_s] = tab[1].to_s
          end
        end
        @current_params["providers"] = {}
        unless params[:ags].blank?
          prov_keys = []
          prov_keys = params[:ags].split(",")
          prov_keys.each do |psk|
            j = Provider.find_by(string_key: psk)
            @current_params["providers"]["#{j.id}"] = '1' unless j.nil?
          end
        end
        @current_params['pp_category_id'] = JSON.parse(@current_params['pp_category_id'])
        @current_params[:default_per_page] = val_def_ppage
        @current_params[:search_since] = val_def_since
        @show_facet = 1
        redirect_to controller: "searches", action: "create", params: @current_params and return
      end
      cearch = {}
      sort = @current_params["sort"] ? @current_params["sort"] : 'reception_date'
      sort = "by_#{sort}"
      @current_params['b_and_w'] = 'all' if @current_params['b_and_w'].blank?
      @current_params['pp_category_id'] = (@current_params['pp_category_id'].blank? || @current_params['pp_category_id']==['all'] )? [] : @current_params['pp_category_id'].map(&:to_i)
      cearch[:per_page] = @scroll_medias ? NB_PER_PAGE : val_def_ppage
      @perpage = cearch[:per_page]
      cearch[:page] = params["page"].to_i if params["page"] && params["page"].to_i > 0
      cearch[:conditions] = Image.params_to_conditions(@current_params)
      cearch[:with] = Image.params_to_with(@current_params)
      # cearch[:retry_stale] = true
      cearch[:per_page] = 10000 if request.format == 'text/csv'
      #Paris 2024 filter
      if @current_params['paris2024'] == '1'
        paris2024_search = t('paris2024_search')
        if @current_params['translation'] == '1'
          translated_paris2024 = session[:locale]=='fr' ? t('paris2024_search',locale: :en) : t('paris2024_search',locale: :fr)
        end
      end
      if @current_params['translation'] == '1' && @current_params['paris2024'] == '1'
        keywords_unfiltered = @current_params["key_words"].blank? ? "(#{paris2024_search}) | (#{translated_paris2024})" : "(#{@current_params[:key_words]}) and ((#{paris2024_search}) | (#{translated_paris2024}))"
      elsif @current_params['paris2024'] == '1'
        keywords_unfiltered = @current_params["key_words"].blank? ? paris2024_search : "(#{@current_params[:key_words]}) and (#{paris2024_search})"
      else
        keywords_unfiltered = @current_params["key_words"].blank? ? '' : @current_params[:key_words]
      end
      # keywords_unfiltered = @current_params["key_words"].blank? ? ( paris2024_search.blank? ? '' : paris2024_search ) : ( paris2024_search.blank? ? @current_params[:key_words] : "(#{@current_params[:key_words]}) and (#{paris2024_search})" )
      keywords_pp2 = @current_params["key_words"].blank? ? '' : @current_params[:key_words]
      keywords = Pixways::SearchesHelper.filter_keywords(keywords_unfiltered)
      cearch[:excerpts] = {limit: 1024}
      @medias = Image.instance_eval(sort).search(keywords, cearch)

      unless @show_facet == 0

        @medias.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane
        @t_entries = @medias.total_entries
        @show_facet = 2 unless @current_params["res_per_prov"]
        @nb_images = {}
        facets = Image.facets(keywords, cearch.except(:page, :per_page))
        @nb_images = facets[:provider_id]
        unless Server.itself?(PIXADMIN_SERVER_NAME)
          unless params[:page] || @current_params["key_words"].blank? || u.is_superadmin?
            iptc_field = {}
            s_stat = SearchStat.create(keyword: @current_params["key_words"], translation: @translated_search, special_filter: @current_params['paris2024'], since: val_def_since, tri: val_def_sort,
                                       date_pp_from: date_to_db_format(@current_params["reception_date_begin"]), date_pp_to: date_to_db_format(@current_params["reception_date_end"]),
                                       date_photo_from: date_to_db_format(@current_params["date_created_begin"]), date_photo_to: date_to_db_format(@current_params["date_created_end"]),
                                       format: @current_params["ratio"], result: @t_entries, user_id: u.id)
            [:subject, :creator, :city, :country].each do |ipf|
              iptc_field[ipf] = @current_params[ipf] unless @current_params[ipf].blank?
            end
            s_stat.search_image_fields.create(iptc: iptc_field) unless iptc_field.empty?
            provs = {}
            if @current_params["providers"].blank?
              @providers.each do |p|
                provs[p.id] = @nb_images[p.id].nil? ? 0 : @nb_images[p.id]
              end
            else
              @providers.each do |p|
                if @current_params["providers"]["#{p.id}"] == '1'
                  provs[p.id] = @nb_images[p.id].nil? ? 0 : @nb_images[p.id]
                end
              end
            end
            s_stat.provider_for_search_stats.create(provs: provs)
          end
        end
      end

      # chercher resultats dans PP+
      @show_pp2_results = (session[:pixtech] && !session[:pixtech].blank?)? Pixways.get_pixtech_param_value(session[:pixtech],'show_pp2_results') : true
      unless params[:page]
        if @current_params['res_pp2'] && !Server.itself?(PP2_SERVER_NAME)
          unless @show_pp2_results == 'false' || @current_params['hide_pp2'] == 0
            provs_key = ""
            unless @current_params["providers"].blank?
              @providers.each do |p|
                if @current_params["providers"]["#{p.id}"] == '1'
                  provs_key += "#{p.string_key},"
                end
              end
              provs_key.chomp!(",")
            end
            @provs = provs_key
            params_excluded = ["utf8", "authenticity_token", "hide_pp2", "res_pp2", "commit", "default_per_page", "ppp_res", "providers", "res_per_prov"]
            @pp2_params = ""
            @current_params_pp2 = {}
            @current_params.except(*params_excluded).each do |k, v|
              if k=='key_words' && !keywords_pp2.blank?
                @pp2_params += "@@@#{k}$$$#{keywords_pp2}"
                @current_params_pp2[k] = keywords_pp2
              else
                @pp2_params += "@@@#{k}$$$#{v}"
                @current_params_pp2[k] = v
              end
            end
            safeurl = URI.encode("#{PP2_URL}results_pp".strip)
            payload = {"pp2_params" => @current_params_pp2, "provs" => provs_key, "ulog" => u.login, "locale" => locale}
            content_type = :json
            begin
              res = RestClient::Request.execute(
                method: :post,
                url: safeurl,
                open_timeout: 5,
                read_timeout: 5,
                ssl_timeout: 5,
                timeout: 5,
                payload: payload,
                content_type: :json,
                accept: content_type
              )
            rescue => e
              logger.info"**** rescue #{e.inspect}"
              pp_res = "Erreur"
            end
            unless pp_res == "Erreur"
              if Pixways.valid_json(res.body)
                retour = JSON.parse(res.body)
                pp_res = retour["result"]
              else
                pp_res = "Erreur"
              end
              session[:pp2_res] = pp_res.to_i unless pp_res == "Erreur"
            end
          end
        end
      end
    end
    @idisp = u.setting.display_params['display_text'].to_i
    @ivis = u.setting.display_params['previsualisation'].to_i
    @reload = (u.setting.reload_pref) * 60 unless u.setting.reload_pref == 0
    @page_encours = params[:page] ? params[:page] : 1
    @loginppp = marek_crypt(u.login)
    respond_to do |format|
      format.html {
      }
      format.js {
      }
      format.csv {
        send_data Image.export_to_csv(@medias, session[:provhd],current_user, session[:pixtech], session[:service_name], session[:creator_word]), filename: 'Liste_resultats_' + Time.now.strftime('%Y-%m-%d_%H-%M') + '.csv', type: 'text/csv; header=none'
        #AdminMailer.list_transmission(Image.export_to_csv(@medias,session[:provhd]), filename: 'Liste_resultats_' + Time.now.strftime('%Y-%m-%d_%H-%M') + '.csv')
      }
    end

  end

  def show_light_boxe
    @light_boxes = LightBox.find_by_hash_code(params[:id])
    if current_user && @light_boxes
      redirect_to(full_screen_light_box_path(@light_boxes.id))
    else
      render "erreur_lb", layout: "simple"
    end
  end

  def feed
    @saved_search = current_user.saved_searches.find(params[:saved_search_id])
    @medias = search_action(RSS_PER_PAGE)

    @saved_search.update_attribute(:date_last_search, Time.now)

    respond_to do |format|
      format.rss {render layout: nil}
    end
  end

  private

  def search_action(per_page)
    cearch = {}

    sort = 'reception_date'
    sort = @current_params["sort"] if @current_params["sort"]
    sort = "by_#{sort}"

    cearch[:per_page] = per_page
    cearch[:per_page] = @current_params["per_page"].to_i if @current_params["per_page"]
    cearch[:page] = params["page"].to_i if params["page"]
    cearch[:conditions] = Image.params_to_conditions(@current_params)
    cearch[:with] = Image.params_to_with(@current_params)

    keywords = @current_params["key_words"] ? Pixways::SearchesHelper.filter_keywords(@current_params["key_words"]) : ''
    cearch[:match_mode] = :extended
    cearch[:excerpt_options] = {:limit => 2048}
    Image.instance_eval(sort).search(keywords, cearch)
  end

  def update_pos_img(ids)
    lb = session[:active_light_box]
    pos = 0
    ids.each do |id|
      lbi = LightBoxImage.where(light_box_id: lb, image_id: id).take
      lbi.update_attributes(position: pos) unless lbi.nil?
      pos += 1
    end
  end

  def feed_basic_authentication
    # Ask for basic auth only if user is not already logged_in (external RSS readers or first click on an RSS item)
    unless current_user
      #authenticate_or_request_with_http_basic("#{I18n.t'authentication_required'}") do |username, password|
      #  @current_user = User.authenticate(username, password)
      #end
      store_location
      redirect_to controller: "user_sessions", action: "new"
    end
  end

end
