require 'net/ftp'

class Admin::UsersController < ApplicationController

  attr_reader :users
  layout :false
  before_filter :superadmin_login_required

  def index
    where_text = ''
    if params[:title_id] && params[:title_id] != '0'
      if params[:title_id] == 'orphans'
        where_text += "(title_id not in (#{Title.pluck(:id).join(',')}) or title_id is null or title_id=0)"
      else
        where_text += "title_id = #{params[:title_id]}"
      end
    end
    if params[:server_id] && params[:server_id] != '0'
      where_text += where_text.blank? ? "titles.server_id = #{params[:server_id]}" : " and titles.server_id = #{params[:server_id]}"
    end
    if params[:role_mask] && params[:role_mask] != '0'
      where_text += where_text.blank? ? "roles_mask = #{params[:role_mask]}" : " and roles_mask = #{params[:role_mask]}"
    end
    if params[:status] && params[:status] != ''
      where_text += where_text.blank? ? "users.status = '#{params[:status]}'" : " and users.status = '#{params[:status]}'"
    end
    if where_text.blank?
      @users = User.order("login ASC")
    else
      if params[:server_id] && params[:server_id] != '0'
        @users = User.joins(:title).where(where_text).order("login ASC")
      else
        @users = User.where(where_text).order("login ASC")
      end
    end
    respond_to do|format|
      format.js {render layout: nil}
      format.csv {send_data export_csv(@users), filename: "listing_Users_PixPalace_#{Time.now.strftime('%Y-%m-%d_%H-%M')}.csv", type: 'text/csv; header=present'}
    end
  end

  def new
    @user = User.new
    @user.title_id = params[:title_id] if params[:title_id] && (params[:title_id]!='0' && params[:title_id]!='orphans')
    respond_to do |format|
      format.js{}
    end
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
    @current_title = @user.title_id
  end

  def create
    @user = User.new(permitted_params)
    if @user.save
      #user copy on PixPalace 2
      pp2_replication("pixpalace2",@user) if Server.itself?(PIXADMIN_SERVER_NAME)
      redirect_to admin_users_path(title_id: @user.title_id), notice: @user.title_id
    else
      # res = {}
      # res['error'] = @user.errors.full_messages
      # render action: "new", json: res.to_json
      render action: "new", format: :js
    end
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(permitted_params)
      #user copy on PixPalace 2
      pp2_replication("pixpalace2",@user) if Server.itself?(PIXADMIN_SERVER_NAME)
      redirect_to admin_users_path(title_id: @user.title_id), notice: t('successfully_updated')
    else
      # res = {}
      # res['error'] = @user.errors.full_messages
      # render action: "edit", json: res.to_json
      render action: "edit", format: :js
    end
  end

  def destroy
    #@user = User.find(params[:id])
    #@user.destroy
  end

  def pp2_replication(database_config_name,cur_user)

    # Use only if title and group are the same on PA and PP2. Beware : group should already exist on PP2 as it is not replicated below
    # cur_title = Title.find(cur_user.title_id)
    # #group_name = cur_title.nil? ? 'tout_titre' : (cur_title.title_provider_group_name.nil? ? 'tout_titre' : cur_title.title_provider_group_name.name)
    # group_name = 'tout_titre'

    # check if it is a PixTech author (use only if title and group are not the same on PA and PP2. Beware : group should already exist on PP2 as it is not replicated below)
    prov_user = Provider.where("string_key like '%#{cur_user.login}' and provider_type_id=2").first
    if prov_user.nil?
      cur_title = cur_user.title
      group_name = cur_user.title.title_provider_group_name.name
    else
      #PixTech authors
      if prov_user.is_pixtech_author?
        #cur_title = Title.find_by(name: "#{prov_user.pixtech.name.capitalize} #{cur_user.last_name} #{cur_user.first_name}")
        cur_title = Title.find_by(name: "#{prov_user.pixtech.name.capitalize}Auteurs")
        cur_title = cur_user.title if cur_title.nil?
        group_name = "0_#{prov_user.pixtech.name.capitalize}Auteurs"
      end
    end

    begin
      config_db_pp2 = Rails.configuration.database_configuration[database_config_name]
      pp2_client = Mysql2::Client.new(:host => config_db_pp2["host"],:database => config_db_pp2["database"],:username => config_db_pp2["username"], :password => config_db_pp2["password"])
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
      flash[:notice] =  'Echec de la replication sur PixPalace2'
      return
    end
    #Get id of country "France"
    begin
      pp2_country_id=pp2_client.query("select id from countries where name='France'").first['id']
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
    rescue
      pp2_country_id=1
      logger.warn 'Warning : "France" country does not exist, title country will be 1'
    end
    # Get id of restrictions group
    begin
      pp2_group_id=pp2_client.query("select id from title_provider_group_names where name='#{group_name}'").first['id']
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
    rescue
      pp2_group_id=pp2_client.query("select id from title_provider_group_names where name='tout_titre'").first['id']
      logger.warn "Warning : '#{group_name}' group does not exist, title group will be 'tout_titre'"
    end
    #id of current server
    begin
      pp2_server_id=pp2_client.query("select id from servers where is_self").first['id']
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
    rescue
      pp2_server_id=1
      logger.warn 'Warning : there is no current server, server id will be 1'
    end
    #Create title if it doesn't exist, otherwise update it
    begin
      pp2_title_id=pp2_client.query("select id from titles where name='#{cur_title.name.gsub(/'/,"\\\\'")}'").first['id']
      escaped_query="update titles set name=\"#{cur_title.name}\",hide_unauthorized_providers=#{cur_title.hide_unauthorized_providers},dpi=#{cur_title.dpi},flow_path=\"#{cur_title.flow_path}\",title_provider_group_name_id=#{pp2_group_id},server_id=#{pp2_server_id},country_id=#{pp2_country_id},updated_at=\"#{cur_title.updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",first_name=\"#{cur_title.first_name}\",last_name=\"#{cur_title.last_name}\",address=\"#{cur_title.address}\",zip_code=\"#{cur_title.zip_code}\",city=\"#{cur_title.city}\",phone=\"#{cur_title.phone}\",email=\"#{cur_title.email}\",comment=\"#{cur_title.comment}\",visible=#{cur_title.visible},titles.group=\"#{cur_title.group}\",title_type=\"#{cur_title.title_type}\",visible_name=\"#{cur_title.visible_name}\" where id =#{pp2_title_id};".gsub(/'/,"\\\\'")
      pp2_client.query(escaped_query)
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
    rescue
      escaped_query="insert into titles (name,hide_unauthorized_providers,dpi,flow_path,title_provider_group_name_id,server_id,country_id,created_at,updated_at,first_name,last_name,address,zip_code,city,phone,email,comment,visible,titles.group,title_type,visible_name) values (\"#{cur_title.name}\",#{cur_title.hide_unauthorized_providers},#{cur_title.dpi},\"#{cur_title.flow_path}\",#{pp2_group_id},#{pp2_server_id},#{pp2_country_id},\"#{cur_title.created_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_title.updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_title.first_name}\",\"#{cur_title.last_name}\",\"#{cur_title.address}\",\"#{cur_title.zip_code}\",\"#{cur_title.city}\",\"#{cur_title.phone}\",\"#{cur_title.email}\",\"#{cur_title.comment}\",#{cur_title.visible},\"#{cur_title.group}\",\"#{cur_title.title_type}\",\"#{cur_title.visible_name}\");".gsub(/'/,"\\\\'")
      pp2_client.query(escaped_query)
      pp2_title_id = pp2_client.query("select id from titles where name='#{cur_title.name.gsub(/'/,"\\\\'")}'").first['id']
    end
    #Create user if it doesn't exist, otherwise update it
    begin
      pp2_user_id=pp2_client.query("select id from users where login='#{cur_user.login}'").first['id']
      escaped_query="update users set first_name=\"#{cur_user.first_name}\",last_name=\"#{cur_user.last_name}\",email=\"#{cur_user.email}\",phone=\"#{cur_user.phone}\",login=\"#{cur_user.login}\",crypted_password=\"#{cur_user.crypted_password}\",salt=\"#{cur_user.salt}\",persistence_token=\"#{cur_user.persistence_token}\",perishable_token=\"#{cur_user.perishable_token}\",updated_at=\"#{cur_user.updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",password_updated_at=\"#{cur_user.password_updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",roles_mask=\"#{cur_user.roles_mask}\",status=\"#{cur_user.status}\",title_id=#{pp2_title_id} where id=#{pp2_user_id};".gsub(/'/,"\\\\'")
      pp2_client.query(escaped_query)
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
    rescue
      escaped_query="insert into users (first_name,last_name,email,phone,login,crypted_password,salt,persistence_token,perishable_token,created_at,updated_at,password_updated_at,roles_mask,status,title_id) values (\"#{cur_user.first_name}\",\"#{cur_user.last_name}\",\"#{cur_user.email}\",\"#{cur_user.phone}\",\"#{cur_user.login}\",\"#{cur_user.crypted_password}\",\"#{cur_user.salt}\",\"#{cur_user.persistence_token}\",\"#{cur_user.perishable_token}\",\"#{cur_user.created_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_user.updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_user.password_updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_user.roles_mask}\",\"#{cur_user.status}\",#{pp2_title_id});".gsub(/'/,"\\\\'")
      pp2_client.query(escaped_query)
      pp2_user_id=pp2_client.query("select id from users where login='#{cur_user.login}'").first['id']
    end
    user_pwd=params[:user][:password]
    unless user_pwd.blank?
      #Update pixlogs table (for automatic login from PP to PP+)
      begin
        pp2_client.query("select company from pixlogs where username='#{cur_user.login}'").first['company']
        pp2_client.query("update pixlogs set company='#{user_pwd}' where username='#{cur_user.login}'")
      rescue Mysql2::Error => e
        logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
      rescue
        pp2_client.query("insert into pixlogs (username,company) values ('#{cur_user.login}','#{user_pwd}')")
      end
    end
    #Create settings if they doesn't exist
    begin
      pp2_client.query("select id from settings where user_id=#{pp2_user_id}").first['id']
    rescue Mysql2::Error => e
      logger.error Time.now().strftime("%Y-%m-%d %H:%M:%S ")+"[ERROR] #{e.message} on "+config_db_pp2["host"]
    rescue
      cur_user.setting = Setting.create(current_user.passed_settings) if cur_user.setting.blank?
      pp2_user_display_params="---\nbackground_color: ! '#{cur_user.setting.display_params['background_color']}'\nfont_color: ! '#{cur_user.setting.display_params['font_color']}'\nprevisualisation: '#{cur_user.setting.display_params['previsualisation']}'\ndisplay_text: '#{cur_user.setting.display_params['display_text']}'\n"
      pp2_user_border_color_provider="--- {}\n"
      escaped_query="insert into settings (language,preferential_corpus,display_params,border_color_provider,user_id,created_at,updated_at,time_zone,default_per_page,default_since,default_sort) values (\"#{cur_user.setting.language}\",\"#{cur_user.setting.preferential_corpus}\",\"#{pp2_user_display_params}\",\"#{pp2_user_border_color_provider}\",#{pp2_user_id},\"#{cur_user.setting.created_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_user.setting.updated_at.strftime("%Y-%m-%d %H:%M:%S")}\",\"#{cur_user.setting.time_zone}\",#{cur_user.setting.default_per_page},\"#{cur_user.setting.default_since}\",\"#{cur_user.setting.default_sort}\");".gsub(/'/,"\\\\'")
      pp2_client.query(escaped_query)
    end
    pp2_client.close
  end

  def export_csv(users)
    users_csv_file = ''
    if Server.itself? PIXADMIN_SERVER_NAME
      begin
        config_db_pp2 = Rails.configuration.database_configuration['pixpalace2']
        pp2_client = Mysql2::Client.new(host: config_db_pp2["host"], database: config_db_pp2["database"], username: config_db_pp2["username"], password: config_db_pp2["password"])
        pp2_pwd=pp2_client.query("select username,company from pixlogs")
        pp2_client.close
      rescue
        pp2_pwd = []
        pp2_client.close if pp2_client
      end
    else
      pp2_pwd = []
    end
    CSV(users_csv_file, {col_sep: ';'}) do |csv|
      csv << [I18n.t('server'),I18n.t('admin.server.internal_url'),I18n.t('admin.server.public_url'),I18n.t('group'),I18n.t('admin.user.title_user'),I18n.t('admin.user.last_name'),I18n.t('admin.user.first_name'),I18n.t('admin.user.mail'),I18n.t('admin.user.roles'),t('status'),I18n.t('admin.user.login'),I18n.t('admin.user.password'),t('admin.user.created_at')]
      users.each do |u|
        user_title = u.title.name rescue ''
        title_group = u.title.title_provider_group_name.name rescue ''
        title_server = u.title.server.name rescue ''
        internal_url = u.title.server.internal_url rescue ''
        public_url = u.title.server.public_url rescue ''
        user_pwd = (u.is_superadmin? || user_title == PIXWAYS_TITLE) ? '' : pp2_pwd.find{|p| p['username']==u.login}['company'] rescue ''
        user_role_mask = I18n.t("roles.#{User::ROLES_MASK[Math.log2(u.roles_mask)]}") rescue ''
        user_created_at = u.created_at.strftime("%Y-%m-%d %H:%M:%S") rescue ''
        csv << [title_server,internal_url,public_url,title_group,user_title,u.last_name,u.first_name,u.email,user_role_mask,t("admin.user.status.#{u.status}"),u.login,user_pwd,user_created_at]
      end
    end
    users_csv_file
  end

  def permitted_params
    params.require(:user).permit(:title_id, :add_role_to_user, :status, :login, :first_name, :last_name, :email, :city, :phone, :password, :password_confirmation)
  end
end