class DashboardController < ApplicationController

  layout "adm_agency"

  before_action :load_cached_search_params

  def index

    #@req_list ||= ''

    stocks = []
    if !session[:pixtech].blank?
      pixtech_provs = Provider.joins(:pixtech).where(pixteches: {name: session[:pixtech]}, providers: {provider_type_id: 1}).pluck('providers.id')
      pixtech_provs.each{|i| stocks << i if session[:provhd][i] == 1}
    elsif current_user.is_superadmin?
      stocks << Provider.find_by(string_key: 'Divergence').id
      stocks << Provider.find_by(string_key: 'Sipa').id
      stocks << Provider.find_by(string_key: 'Saifimages').id
    else
      session[:provhd].each_index{|i| stocks << i if session[:provhd][i] == 1}
    end

    unless stocks.blank?
      @stocks = {}
      @authors_stock = {}
      stocks_string_key = '('
      @stocks_top_used = 0
      @stocks_top_quota = 0
      @nb_requests = 0
      stocks.each do |st|
        nb_pics = Image.search_count with: {provider_id: st, content_error: false}
        stock = Provider.find(st)
        @authors_stock[st] = Provider.where(provider_type_id: 2, pp_string_key: stock.string_key).pluck(:name,:string_key)
        @authors_stock[st] = @authors_stock[st].sort_by {|k,v| k}
        #string_key list for pictures controls
        stocks_string_key << "'#{stock.string_key}',"

        #PP2 pictures number
        if !(Server.itself? PP2_SERVER_NAME)
          url_key = 'pictures_count'
          endpoint_url = PP2_URL
          pp2_res = ''
          begin
            res = RestClient::Request.execute(method: :get, url: "#{endpoint_url}/#{url_key}", timeout: 6, headers: {params: {prov: stock.string_key}}, content_type: :json, accept: :json)
          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
            pp2_res = pp_res.to_i unless pp_res == "Erreur"
          end
        end

        #TOP numbers
        # top_nb_updated = RefreshProvider.find_by(provider_id: st).nb_updated
        top_nb_updated =  UpdatedListProvider.joins(:refresh_provider).where(refresh_providers:{provider_id: st},created_at: Time.now().beginning_of_month..Time.now().end_of_month).sum(:nb_photos)
        top_total_update = RefreshProvider.find_by(provider_id: st).total_update
        @stocks_top_used += top_nb_updated
        @stocks_top_quota += top_total_update

        # Requests number
        @nb_requests += SelectedProvidersForRequest.where("provider_id = ?",st).count

        # @stocks[st]=[stock.name,nb_pics,pp2_res,stock.string_key,top_nb_updated,top_total_update]
        @stocks[st]=[stock.name,nb_pics,pp2_res,stock.string_key]
      end
      stocks_string_key.chop! << ')'
      @stocks_sorted = @stocks.sort_by {|k,v| v[0] }

      unless current_user.is_superadmin? || stocks_string_key.blank?

        begin
        #get pictures controls total number
        config_db_ms = Rails.configuration.database_configuration['ms_db']
        client = Mysql2::Client.new(:host => config_db_ms["host"],:database => config_db_ms["database"],:username => config_db_ms["username"], :password => config_db_ms["password"])
        client.query("SELECT count(*) as nb_ctrls FROM MessageToPA WHERE mtpa_done = 0 AND mtpa_param1 in #{stocks_string_key} AND mtpa_message='1'").each do |row|
          @nb_ctrls = row['nb_ctrls']
        end
        rescue
          @nb_ctrls = ''
        end

        #get offers number
        @nb_offers = Reportage.where("string_key in #{stocks_string_key} and offre = 1").count

      end

    end

    respond_to do|format|
      format.html {
        if stocks.blank?
          render file: "#{Rails.public_path}/401.html", layout: false, status: 401
        else
          render 'adm_agency/dashboard'
        end
      }
      format.csv {
        requested_serv = params[:requested_list].split(',')[0]
        requested_prov = params[:requested_list].split(',')[1]
        case requested_serv
        when '1'
          csv_filename = "Liste_fichiers_PixPalace_#{requested_prov}_#{Time.now.strftime('%Y-%m-%d_%H-%M')}.csv"
        when '2'
          csv_filename = "Liste_fichiers_PixPalace2_#{requested_prov}_#{Time.now.strftime('%Y-%m-%d_%H-%M')}.csv"
        end
        csv_file =  export_stock_list(requested_serv,requested_prov)
        send_data csv_file, filename: csv_filename, type: 'text/csv; header=present' unless csv_file.blank?
      }
    end
  end

  def send_list
    begin
      deletion_options = ''
      action_type = ''
      options_value = params[:del_auth_chkbox].to_i + params[:del_pp_chkbox].to_i + params[:del_pp2_chkbox].to_i + params[:transfer_pp2_chkbox].to_i + params[:send_pp_chkbox].to_i + params[:send_pp2_chkbox].to_i + params[:top_chkbox].to_i
      case options_value
      when 1
        deletion_options = 'delete_pp_action'
        action_type = 'deletion'
      when 2
        deletion_options = 'delete_pp2_action'
        action_type = 'deletion'
      when 3
        deletion_options = 'delete_pp_pp2_action'
        action_type = 'deletion'
      when 4
        deletion_options = 'transfer_pp2_action'
        action_type = 'transfer'
      when 6
        deletion_options = 'send_pp_action'
        action_type = 'send'
        serv_dest = 'PP'
      when 8
        deletion_options = 'send_pp2_action'
        action_type = 'send'
        serv_dest = 'PP2'
      when 13
        deletion_options = 'delete_auth_action'
        action_type = 'deletion'
      when 20
        deletion_options = 'top_action'
        action_type = 'top'
        serv_dest = 'PP'
      else
        raise t('dashboard.no_action_selected')
      end
      uploaded_list = params['list_to_transmit']
      original_listname = uploaded_list.original_filename
      original_extension = File.extname(original_listname)
      # multiple files managment
      #uploaded_list.each do |list|
      list_filename = Time.now.strftime('%Y-%m-%d-%Hh%Mm%S')+"_#{current_user.title.name}_#{action_type}#{original_extension}"
      list_file = Rails.root.join('public','uploads',list_filename)
      File.open(list_file,'wb') do |f|
        f.write(uploaded_list.read)
      end
      # nb_lines = `wc -l #{list_file}`.to_i
      nb_lines = `gawk 'END {print NR}' RS='\r|\n|\r\n' #{list_file}`.to_i
      #mime_type = `file #{list_file} --mime-type -b`.strip
      #raise I18n.t'dashboard.file_type_error' if mime_type != "text/csv" && mime_type != "text/plain" && mime_type != "application/vnd.ms-excel"
      server_name = Server.find_by_is_self(true).name
      # Check if deletion is done on PixTech provider to delete PixPalace pictures too
      prov = Provider.find_by(string_key: params[:prov_sk])
      unless prov.nil?
        params[:auth_name] = Provider.find_by(string_key: prov.pp_string_key).name rescue '' if params[:auth_name].blank? && prov.pp_string_key != prov.string_key
        params[:auth_sk] = prov.pp_string_key if params[:auth_sk].blank? && prov.pp_string_key != prov.string_key
      end
      AdminMailer.list_transmission(list_filename,list_file,params[:prov_name],params[:prov_sk],params[:auth_sk],deletion_options,action_type,nb_lines).deliver_now
      UserMailer.list_transmission(original_listname,deletion_options,action_type,I18n.t(session[:creator_word]),params[:auth_name],I18n.t(session[:provider_word],count:1),params[:prov_name],nb_lines,current_user.email,server_name).deliver_now
      redirect_to pixtech_envoi_pp_path(pictures_list: list_file, original_listname: original_listname, serv_dest: serv_dest, author: params[:auth_sk]) if options_value == 6 || options_value == 8
    rescue => e
      flash[:alert] = "#{t('dashboard.transmission_error')} : #{e}"
      redirect_to :back if options_value == 6 || options_value == 8
    else
      flash[:notice] = t('dashboard.transmission_succeed')
    ensure
      redirect_to :back unless options_value == 6 || options_value == 8
    end
  end

  def export_stock_list(req_serv, req_prov)
    export = ''
    export.encode!('UTF-8')
    if req_serv=='1'
      #get PP pictures total number
      CSV(export) do |csv|
        #get PP2 pictures total number
        config_pp2 = Rails.configuration.database_configuration['production']
        client = Mysql2::Client.new(:host => config_pp2["host"],:database => config_pp2["database"],:username => config_pp2["username"], :password => config_pp2["password"])
        client.query("SELECT original_filename FROM images WHERE provider_id=(select id from providers where string_key='#{req_prov}') AND content_error=0").each do |row|
          csv << [row['original_filename']]
        end
      end
    elsif req_serv=='2'
      CSV(export) do |csv|
        #get PP2 pictures total number
        config_pp2 = Rails.configuration.database_configuration['pixpalace2']
        client = Mysql2::Client.new(:host => config_pp2["host"],:database => config_pp2["database"],:username => config_pp2["username"], :password => config_pp2["password"])
        client.query("SELECT original_filename FROM images WHERE provider_id=(select id from providers where string_key='#{req_prov}') AND content_error=0").each do |row|
          csv << [row['original_filename']]
        end
      end
    end
    export
  end

  def remaining_top
    # top_nb_updated = RefreshProvider.find_by(provider_id: params[:prov_id]).nb_updated
    top_nb_updated = UpdatedListProvider.joins(:refresh_provider).where(refresh_providers:{provider_id: params[:prov_id]},created_at: Time.now().beginning_of_month..Time.now().end_of_month).sum(:nb_photos)
    top_total_update = RefreshProvider.find_by(provider_id: params[:prov_id]).total_update
    render plain: top_total_update - top_nb_updated
  end

end

