class Admin::UsersController < Admin::ApplicationController
  before_action :set_active_menu

  def index
    authorize :users_manage, :view_users?
    conditions = begin
      params.require(:user_search).permit(:name_cont, levels: [])
    rescue
      {}
    end
    @user_search = UserSearch.new(conditions)

    user_scope = User
    if @user_search.name_cont.present?
      user_scope = user_scope.where(["email LIKE ?", "%#{@user_search.name_cont}%"])
    end
    if @user_search.levels.present? && !@user_search.levels.include?("-1")
      levels = @user_search.levels.map { |l| l.to_i }
      user_scope = user_scope.where(level: levels)
    end

    @pagy, @users = pagy(user_scope.order("id DESC"))
  end

  # GET /admin/users/:id
  def show
    @user = User.find params[:id]
    authorize @user, policy_class: UsersManagePolicy
  end

  def new
    @active_menu = "users_manage"
    @user = User.new
  end

  # POST /admin/users or /admin/users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        @user.confirm!
        format.html { redirect_to admin_users_path, notice: "User was successfully created." }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    @user = User.find params[:id]
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to admin_users_path, notice: "User was successfully updated." }
        format.turbo_stream
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  def edit_role
    logger.info "turbo_frame_request?:#{turbo_frame_request?}"
    @user = User.find params[:id]
    respond_to do |format|
      format.html
    end
  end

  def save_role
    @user = User.find params[:id]
    level_params = params.require(:user).permit(:level)

    respond_to do |format|
      if @user.update(level_params)
        format.html { redirect_to admin_users_path, notice: "User was successfully updated." }
        format.turbo_stream
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit_role, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  def edit
    logger.info "turbo_frame_request?:#{turbo_frame_request?}"
    @user = User.find params[:id]
    respond_to do |format|
      format.html
    end
  end

  def trashed
    @pagy, @users = pagy(User.trashed.order("updated_at DESC"))
  end

  def destroy
    @user = User.find params[:id]
    audit! :delete_user, nil, payload: @user.attributes
    @user.trash!

    respond_to do |format|
      format.turbo_stream
      format.html { redirect_to admin_users_path, notice: "User was successfully destroyed." }
      format.json { head :no_content }
    end
  end

  private

  def set_active_menu
    @active_menu = "users_manage"
  end

  # Only allow a list of trusted parameters through.
  def user_params
    params.require(:user).permit(:email, :username, :password)
  end
end
