require "json"
require 'rest_client'
require "mysql2"

class SearchStat < ActiveRecord::Base

  belongs_to :user
  #validates :user_id, presence: true
  has_many :provider_for_search_stats, dependent: :destroy
  has_many :search_image_fields, dependent: :destroy

  paginates_per 100

  def self.envoi_pixadmin
    server_url = "http://#{Server.find_by_name("Pixadmin").host}:#{Server.find_by_name("Pixadmin").api_port}/"
    cs_name = Server.find_by_is_self(true).name
    api_res = ""
    url_key = "cs_request"
    safeurl = URI.encode("#{server_url}#{url_key}".strip)
    SearchStat.all.each do |s|
      parameters = {id: s.id, :keyword => s.keyword, :since => s.since, :tri => s.tri, :date_pp_from => s.date_pp_from,
                    :date_pp_to => s.date_pp_to, :date_photo_from => s.date_photo_from, :date_photo_to => s.date_photo_to,
                    format: s.format, :result => s.result, :created => s.created_at, :translation => s.translation, :special_filter => s.special_filter}

      message = { "cs_demand" => "search_stat", "cs_name" => cs_name, "user_login" => User.find(s.user_id).login, "var_id" => 0, "parameters" => parameters }
      begin
        res = RestClient.post( safeurl, message.to_json, content_type: :json, accept: :json)
      rescue => e
        if res.blank?
          "Erreur Rest : #{e.inspect}"
        else
          retour = JSON.parse(res.body)
          api_res = retour["result"]
        end
        newjob = CommunicationOutJob.new
        newjob.params = message
        newjob.result = api_res
        newjob.done = 0
        newjob.save
      end
    end
  end

  def self.create_stat(u,i,op)
    self.create(user_id: u, image_id: i, operation_label_id: op)
  end

  def self.export_to_csv(search_stats,img_field,prov_stat,prov_name,provider_word)
    export = ""
    CSV(export, {col_sep: ";", quote_char: '"', force_quotes: true}) do |csv|
      csv << [
        'date',
        I18n.t('title'),
        I18n.t('searchstats.search_words'),
        I18n.t('searchstats.results'),
        I18n.t('results_by_provider', provider_word: I18n.t(provider_word, count: 1)),
        I18n.t('searchstats.reception_date_from'),
        I18n.t('searchstats.reception_date_to'),
        I18n.t('searchstats.date_created_from'),
        I18n.t('searchstats.date_created_to')
      ]

      search_stats.each do |stats|
        user_title = stats.user.blank? ? "" : stats.user.title.name
        searched_words =  stats.keyword
        unless img_field[stats.id].empty?
          img_field[stats.id].each_with_index do |(k,v),i|
            searched_words += "[#{k}] : #{v}"
            if i < img_field[stats.id].size-1
              searched_words += "\n"
            end
          end
        end
        results_by_agency = ""
        prov_stat[stats.id].each_with_index do |(k, v),i|
          results_by_agency += "#{prov_name[k]} : #{v}"
          if i < prov_stat[stats.id].size-1
            results_by_agency += "\n"
          end
        end
        date_pp_from = stats.date_pp_from.nil? ? "" : I18n.l(stats.date_pp_from)
        date_pp_to = stats.date_pp_to.nil? ? "" : I18n.l(stats.date_pp_to)
        date_photo_from = stats.date_photo_from.nil? ? "" : I18n.l(stats.date_photo_from)
        date_photo_to = stats.date_photo_to.nil? ? "" : I18n.l(stats.date_photo_to)

        csv << [I18n.l(stats.cs_created),user_title,searched_words,stats.result,results_by_agency,date_pp_from,date_pp_to,date_photo_from,date_photo_to]
     end
    end
    export
  end

  def self.purge_adm
    dctrls = Time.now.midnight - 15.day
    dres = Time.now.midnight - 14.day
    drtp = Time.now.midnight - 40.day
    dcomm = Time.now.midnight - 60.day
    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"])
    puts "Purge Controles #{dctrls}"
    client.query("delete FROM MessageToPA where mtpa_created_at < '#{dctrls.strftime("%Y-%m-%d %H:%M:%S")}'")
    client.close

    puts "Purge Recherche Utilisateurs #{dres}"
    SearchStat.where('created_at < ?', dres).collect{|s| s.destroy}

    puts "Purge Requete aux Agences #{drtp}"
    RequestToProvider.where('updated_at < ?', drtp).collect{|s| s.destroy}

    puts "Purge Communication_out_jobs #{dcomm}"
    CommunicationOutJob.where('updated_at < ?', dcomm).collect{|s| s.destroy}
    puts "Fin Purges #{Time.now}"
  end
end
