class Admin::UsersController < AdminController
  before_action :authenticate_user!,except: [:write_to_file]
  before_action :dashboard_topbar,except: [:write_to_file]
  skip_before_action :check_permission
  load_and_authorize_resource :class => User
  skip_load_resource :only => [:create,:user_setting,:update_user_setting]
  skip_load_and_authorize_resource :only => [:write_to_file,:create]
  
  def index
    @users = current_user.organisation.users.not_machine_token_users.includes(:role).where.not(is_admin: "true") - [current_user]
    if params[:id].present?
      @user = current_user.organisation.users.not_machine_token_users.find(params[:id])
    else
      @user = current_user.organisation.users.new
    end
    if request.format.json?
      render json: {data: {users: @users.map(&:json_build)}}
    end
  end

  def create
    if params["user"]["authorized_networks"].present?
      network_tags = {}
      network_tags["network_tags"] = params["user"]["authorized_networks"]
      user_params_dup = user_params.merge(network_tags)
      @user = current_user.organisation.users.build(user_params_dup)
    else
      @user = current_user.organisation.users.build(user_params)
    end
    @user.approved = true
    if @user.save
      flash.now[:success] = "User created Successfully"
      json_data = {data: @user.json_build , status: 200}
    else
      json_data = {message: "User is not created (Reason: #{@user.errors.full_messages}). Please check again.", status: 422}
      flash.now[:error] = "Oops! Problem in creating user"
      @users = current_user.organisation.users.includes(:role).where.not(is_admin: "true") - [current_user]
      # render :index
    end
    if request.format.json?
      render json: json_data, status: json_data[:status]
    else
      redirect_to admin_users_path
    end
  end

  def update
    if params["user"]["authorized_networks"].present?
      @user = current_user.organisation.users.not_machine_token_users.find(params[:id])
      network_tags = {}
      network_tags["network_tags"] = params["user"]["authorized_networks"]
      user_params_dup = user_params.merge(network_tags)
      if user_params_dup[:password].blank? && user_params_dup[:password_confirmation].blank?
        status = @user.update_without_password user_params_dup
      else
        status = @user.update user_params_dup
      end
    else
      if user_params[:password].blank? && user_params[:password_confirmation].blank?
        status = @user.update_without_password user_params
      else
        status = @user.update user_params
      end
    end
    if status
      flash[:success] = "User updated Successfully"
      json_data = {data: @user.json_build , status: 200}      
    else
      flash[:error] = "Oops! Problem in user update"
      json_data = {message: "User is not updated (Reason: #{@user.errors.full_messages}).", status: 422}
      @users = current_user.organisation.users.not_machine_token_users.includes(:role).where.not(is_admin: "true") - [current_user]
    end
    if request.format.json?
      render json: json_data, status: json_data[:status]
    else
      redirect_to admin_users_path
    end
  end

  def get_current_user
    if request.format.json?
      render json: {data: current_user.json_build, status: 200}
    end
  end

  def show
    @user = current_user.organisation.users.not_machine_token_users.find(params[:id])
    if request.format.json?
      #@user = current_user.organisation.users.find(params[:id])
      render json: {data: @user.json_build, status: 200}
    end
  end

  def destroy
    @user = current_user.organisation.users.not_machine_token_users.find(params[:id])

    if @user.destroy
      flash[:success] = "User deleted Successfully"
      json_data = {data: {}, status: 200}
    else
      flash[:error] = "Oops! Problem in user delete"
      json_data = {message: "User is not deleted. Please try again." , status: 422}
    end
    if request.format.json?
      render json: json_data, status: json_data[:status]
    else
      redirect_to admin_users_path
    end
  end

   def email_exist
    render :json=>{:status=>true} and return if params[:email].blank?
    new_user = User.where(email: params[:email]).first if params[:user_id].blank?
    unless params[:user_id].blank?
      existing_user = User.where(email: params[:email],id: params[:user_id]).first
      change_user_email = User.where(email: params[:email]).first
    end
    render :json=>{:status=>false} and return if(new_user.present?)
    render :json=>{:status=>true} and return if(new_user.blank? && params[:user_id].blank?)
    render :json=>{:status=>false} and return if(existing_user.blank? && change_user_email.present?)
    render :json=>{:status=>true} and return if(existing_user.blank? && change_user_email.blank?)
    render :json=>{:status=>true} and return if(existing_user.id == change_user_email.id)
  end

  def user_setting
    @user = User.new
  end

  def update_user_setting
    if current_user.valid_password?(params[:user][:current_password])
      if params[:user][:password].eql?params[:user][:password_confirmation]
        flash[:success] = "Your Password has been updated!" if current_user.update_attribute(:password ,params[:user][:password])
        UserMailer.delay.password_changed(current_user.id)
        sign_in current_user, :bypass => true
      else
        flash[:notice]= "Sorry! New Passowrd and Confirmation password does not match, please try again"
      end
    else
      flash[:notice] = "Sorry! Current Passowrd is not valid, please try again"
    end
    redirect_to user_setting_admin_users_path
  end

  def write_to_file
   puts "writing in the file"
   f_path =  Rails.root.join("public/temp_file/temp_file.txt")
      Dir.mkdir(Rails.root.join("public/temp_file")) unless Dir.exist?(Rails.root.join("public/temp_file"))
      #temp_file = Tempfile.new("temp_file")
      File.open(f_path, 'a') do |file|
          file.write("\n")
          file.write(params[:input])
      end
      #temp_file.rewind
      #FileUtils.cp(temp_file.path, f_path)
      FileUtils.chmod 0755, "#{f_path}"
      #temp_file.unlink
       render :json=>{:status=>true,:msg => 'Successfully wrote data to file'}
  end

  private

  def user_params
    params.require(:user).permit(:full_name, :email, :password, :password_confirmation, :phone_number, :role_id, :network_tags, :tag_list ,:authorized_networks => [:full => [], :limited => []])
  end
end
