class ReportagesController < ApplicationController

  layout "reportage"

  before_action :load_cached_search_params, only: ["index", "liste"]

  helper_method :sort_column, :sort_direction

  def create
    if params[:button]
      redirect_to reportages_path
    else
      @reportage = Reportage.new(permitted_params)
      if @reportage.save
        ids = []
        ids = params[:reportage][:prem_photo].split("&")
        ids.map!{|s| s.to_i}
        ids.each do |i|
          img = Image.find(i).ms_image_id
          ReportagePhoto.create(reportage_id: @reportage.id, photo_ms_id: img)
        end
        im = Image.find(ids[0])
        @reportage.update(no_reportage: "#{@reportage.no_reportage}_#{@reportage.id}", string_key: Provider.find(im.provider_id).string_key, prem_photo: im.ms_image_id, nb_photos: ids.count, signatur: im.normalized_credit, offre: 1)
        rep_json(@reportage,"create")
        redirect_to action: :index, notice:  I18n.t('successfully_created')
      else
        redirect_to action: :new, id: params[:lbid], notice:  'Erreur lors de création du reportage'
      end
    end
  end

  def update
    @reportage = Reportage.find(params[:id])
    if @reportage.update_attributes(permitted_params)
      ids = []
      unless params[:reportage][:prem_photo].blank?
        ids = params[:reportage][:prem_photo].split("&")
        ids.map!{|s| Image.find(s.to_i).ms_image_id}
        im = Image.find_by(ms_image_id:ids[0])
        @reportage.update(prem_photo: ids[0], signatur: im.normalized_credit, offre: 1)
      end
      all_reportage_pics = @reportage.reportage_photos.pluck(:photo_ms_id)
      pics_to_remove = all_reportage_pics - ids
      ReportagePhoto.where(reportage_id: @reportage.id, photo_ms_id: pics_to_remove).destroy_all unless pics_to_remove.blank?
      ids.each_with_index {|i,index| ReportagePhoto.where(reportage_id: @reportage.id, photo_ms_id: i).update_all(rang: index)}
      rep_json(@reportage,"update")
      redirect_to(action: :index, keyword: params[:keyword], liste_providers: params[:liste_providers], offres_reportages: params[:offres_reportages], sort: params[:sort], direction: params[:direction], page: params[:page], :notice => I18n.t('successfully_updated'))
    else
      render :edit
    end
  end

  def destroy
    rep = Reportage.find(params[:id])
    rep_json(rep,"destroy")
    rep.destroy
  end

  def index
    @providers = Provider.find_my_provs(session[:provhd])
    @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)
    @nb_off = 0
    @nb_rep = 0
    @reportages = {}

    if params[:liste_providers].blank?
      liste_prov = "("
      params[:liste_providers]=""
      if params[:providers].blank?
        @providers.collect{|p| liste_prov << "'#{p.string_key}',"}
      else
        params[:providers].keys.collect do |p|
          liste_prov << "'#{Provider.find(p).string_key}',"
          params[:liste_providers] << "#{p},"
        end
      end
      liste_prov.chop! << ")"
      params[:liste_providers].chop!
    else
      liste_providers_array = params[:liste_providers].split(',')
      liste_prov = "("
      liste_providers_array.each do |p|
        liste_prov << "'#{Provider.find(p).string_key}',"
        params[:providers]["#{p}"] = '1'
      end
      liste_prov.chop! << ")"
    end

    params[:offres_reportages]||=1

    unless liste_prov == ")"
      params[:keyword].strip! if params[:keyword]
      if params[:keyword].blank?
        @nb_rep = Reportage.where("string_key in #{liste_prov} and offre = 0").count
        @nb_off = Reportage.where("string_key in #{liste_prov} and offre = 1").count
        @reportages = Reportage.where("string_key in #{liste_prov} and offre = #{params[:offres_reportages]}").order(sort_column + " " + sort_direction).page params[:page]
      else
        keyw = params[:keyword].gsub(/['"\\\x0]/,'\\\\\0')
        @nb_rep = Reportage.where("rep_titre like '%#{keyw}%' and string_key in #{liste_prov} and offre = 0").count
        @nb_off = Reportage.where("rep_titre like '%#{keyw}%' and string_key in #{liste_prov} and offre = 1").count
        @reportages = Reportage.where("rep_titre like '%#{keyw}%' and string_key in #{liste_prov} and offre = #{params[:offres_reportages]}").order(sort_column + " " + sort_direction).page params[:page]
      end
    end

  end

  def edit
    @reportage = Reportage.find(params[:id])
    #@images = ReportagePhoto.where(reportage_id: params[:id]).order(:rang).collect{|p| Image.find_by_ms_image_id(p.photo_ms_id)}
    @images = Image.joins(:reportage_photos).where(reportage_photos:{reportage_id: @reportage.id}).order('reportage_photos.rang')
  end

  def new
    if params[:ids].nil?
      @alert = "#{I18n.t'create_offer_error_header'} :\n#{I18n.t'no_selected_picture'}"
    else
      @light_box = LightBox.find(params[:id])
      rep_id = @light_box.name.split('_').last.to_i
      rep_string_key = @light_box.name.chomp("_#{@light_box.name.split('_').last}")
      rep = Reportage.where(string_key: rep_string_key, id: rep_id).first
      @images = []
      params[:ids].each do |i|
        img = Image.find(i)
        @images << img if session[:provhd][img.provider_id] == 1
      end
      if @images.count < 1
        @alert = "#{I18n.t'create_offer_error_header'} :\n#{I18n.t'no_admin_rights'}"
      else
        provs = @images.uniq{|i| i.provider_id }
        if provs.size > 1
          @alert = "#{I18n.t'create_offer_error_header'} :\n#{I18n.t'multiple_stocks_pictures'}"
        else
          if rep.nil?
            @reportage = Reportage.new(no_reportage: @light_box.name, string_key: Provider.find(@images.first.provider_id).string_key, nb_photos: @images.count, signatur: @images.first.normalized_credit, rep_date: Date.today)
          else
            @reportage = Reportage.new(no_reportage: rep.no_reportage, string_key: rep.string_key, nb_photos: @images.count, signatur: @images.first.normalized_credit, rep_date: rep.rep_date, rep_titre: rep.rep_titre, rep_texte: rep.rep_texte)
            rep_json(rep,"destroy")
            rep.destroy
          end
        end
      end
    end
  end

  def show
    rep_id = params[:id]
    lb_name = "#{Reportage.find(rep_id).string_key}_#{rep_id}"
    LightBox.where(name: lb_name).collect{|v| v.destroy}
    lb = LightBox.create(name: lb_name, user_id: current_user.id, title_id: current_user.title_id)
    lb.save!
    ReportagePhoto.where(reportage_id: rep_id).order(:rang).collect{|p| lb.light_box_images.create(image_id: Image.find_by_ms_image_id(p.photo_ms_id).id, position: p.rang)}
    session[:active_light_box] = lb.id
    redirect_to(home_path)
  end

  def liste
    @list_rep = []
    Panier.where(user_id: current_user.id).collect{|r| @list_rep << r.reportage_id}

    @providers = Provider.where(id: session[:provs]).order(:name)
    @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)

    if params[:liste_providers].blank?
      liste_prov = "("
      params[:liste_providers]=""
      if params[:providers].blank?
        @providers.collect{|p| liste_prov << "'#{p.string_key}',"}
      else
        params[:providers].keys.collect do |p|
          liste_prov << "'#{Provider.find(p).string_key}',"
          params[:liste_providers] << "#{p},"
        end
      end
      liste_prov.chop! << ")"
      params[:liste_providers].chop!
    else
      liste_providers_array = params[:liste_providers].split(',')
      liste_prov = "("
      liste_providers_array.each do |p|
        liste_prov << "'#{Provider.find(p).string_key}',"
        params[:providers]["#{p}"] = '1'
      end
      liste_prov.chop! << ")"
    end

    params[:offres_reportages]||=1
    search_days = Date.today - 4.days
    if params[:panier]
      #@nb_rep = Reportage.where("string_key in #{liste_prov} and updated_at > #{search_days} and nb_photos > 1 and rep_titre != '' and offre = 0").count
      @nb_off = Reportage.where("string_key in #{liste_prov} and nb_photos > 1 and rep_titre != '' and offre = 1 and visible = 1").count
      @reportages = Reportage.where(id: @list_rep, visible: true).order(sort_column + " " + sort_direction).page params[:page]
    else
      params[:keyword].strip! if params[:keyword]
      if params[:keyword].blank?
        #@nb_rep = Reportage.where("string_key in #{liste_prov} and updated_at > '#{search_days}' and nb_photos > 1 and rep_titre != '' and offre = 0").count
        @nb_off = Reportage.where("string_key in #{liste_prov} and nb_photos > 1 and rep_titre != '' and offre = 1 and visible = 1").count
        if params[:offres_reportages].to_i==0
          updated_criteria = "and updated_at > '#{search_days}'"
        else
          updated_criteria =""
        end
        @reportages = Reportage.where("string_key in #{liste_prov} #{updated_criteria} and nb_photos > 1 and rep_titre != '' and offre = #{params[:offres_reportages]} and visible = 1").order(sort_column + " " + sort_direction).page params[:page]
      else
        keyw = params[:keyword].gsub(/['"\\\x0]/,'\\\\\0')
        #@nb_rep = Reportage.where("rep_titre like '%#{keyw}%' and string_key in #{liste_prov} and offre = 0").count
        @nb_off = Reportage.where("rep_titre like '%#{keyw}%' and string_key in #{liste_prov} and offre = 1 and visible = 1").count
        @reportages = Reportage.where("rep_titre like '%#{keyw}%' and string_key in #{liste_prov} and offre = #{params[:offres_reportages]} and visible = 1").order(sort_column + " " + sort_direction).page params[:page]
      end
    end
    @nb_panier = @list_rep.count
  end

  private

  def sort_column
    Reportage.column_names.include?(params[:sort]) ? params[:sort] : "created_at"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "desc"
  end

  def permitted_params
    params.require(:reportage).permit(:rep_titre, :rep_texte, :rep_date, :string_key, :prem_photo, :no_reportage, :nb_photos, :signatur, :visible)
  end

  def rep_json(rep,action)
    if rep.offre or action == "destroy"
      reportage = {}
      reportage["no_reportage"] = rep.no_reportage
      reportage["string_key"] = rep.string_key
      unless action == "destroy"
        reportage["created_at"] = rep.created_at
        reportage["updated_at"] = rep.updated_at
        reportage["prem_photo"] = rep.prem_photo
        reportage["nb_photo"] = rep.nb_photos
        reportage["rep_date"] = rep.rep_date
        reportage["rep_titre"] = rep.rep_titre
        reportage["rep_texte"] = rep.rep_texte
        reportage["signatur"] = rep.signatur
        reportage["visible"] = rep.visible
        reportage["ids"] = []
        ReportagePhoto.where(reportage_id: rep.id).order(:rang).collect{|i| reportage["ids"] << i.photo_ms_id}
      end
      json_reportage = reportage.to_json
      json_filename = "#{action}_feature_"+Time.now.strftime("%Y%m%d-%H%M%S")+".json"
      File.open(Rails.root+FEATURES_PATH+json_filename,'wb') do |f|
        f.write(json_reportage)
      end
    end
  end

end