# app/controllers/usuarios_controller.rb
class UsuariosController < ApplicationController
  before_action :set_usuario, only: [:show, :edit, :update, :destroy, :toggle_ativo]

  def index
    authorize User
    @usuarios = policy_scope(User).order(:name).page(params[:page]).per(20)
    @roles = User.roles.keys
  end

  def show
    authorize @usuario
  end

  def new
    @usuario = User.new
    authorize @usuario
  end

  def create
    @usuario = User.new(usuario_params)
    authorize @usuario

    if @usuario.save
      AuditoriaLog.registrar(current_user, 'criar_usuario', request.remote_ip,
                             detalhes: "Criou usuário #{@usuario.email} (#{@usuario.role})")
      redirect_to usuarios_path, notice: 'Usuário criado com sucesso.'
    else
      render :new, status: :unprocessable_entity
    end
  end

  def edit
    authorize @usuario
  end

  def update
    authorize @usuario

    if @usuario.update(usuario_params_update)
      AuditoriaLog.registrar(current_user, 'editar_usuario', request.remote_ip,
                             detalhes: "Editou usuário #{@usuario.email}")
      redirect_to usuarios_path, notice: 'Usuário atualizado.'
    else
      render :edit, status: :unprocessable_entity
    end
  end

  def destroy
    authorize @usuario

    if @usuario == current_user
      redirect_to usuarios_path, alert: 'Você não pode excluir sua própria conta.'
      return
    end

    @usuario.destroy
    AuditoriaLog.registrar(current_user, 'excluir_usuario', request.remote_ip,
                           detalhes: "Excluiu usuário #{@usuario.email}")
    redirect_to usuarios_path, notice: 'Usuário removido.'
  end

  def toggle_ativo
    authorize @usuario, :update?
    @usuario.update!(ativo: !@usuario.ativo)
    status = @usuario.ativo? ? 'ativado' : 'desativado'
    AuditoriaLog.registrar(current_user, "usuario_#{status}", request.remote_ip,
                           detalhes: "#{@usuario.email} foi #{status}")
    redirect_to usuarios_path, notice: "Usuário #{status} com sucesso."
  end

  private

  def set_usuario
    @usuario = User.find(params[:id])
  end

  def usuario_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation,
                                 :role, :pin_acesso, :ativo)
  end

  def usuario_params_update
    permitted = [:name, :email, :role, :pin_acesso, :ativo]
    permitted += [:password, :password_confirmation] if params[:user][:password].present?
    params.require(:user).permit(permitted)
  end
end
