# app/policies/user_policy.rb
class UserPolicy < ApplicationPolicy
  def index? = pode?('admin.usuarios')

  # Cada um enxerga a própria ficha (é assim que a tela de perfil pessoal
  # funciona), além de quem administra usuários.
  def show? = pode?('admin.usuarios') || record == user

  def create? = pode?('admin.usuarios_gerenciar')
  def new?    = create?

  # ⚠️ `record == user` CONTINUA aqui de propósito: é o que permite alguém editar
  # o próprio cadastro (nome, senha). O que NÃO pode é essa mesma pessoa mudar o
  # próprio papel/perfil e se promover — isso é barrado em #alterar_acesso?, que
  # o controller usa para decidir quais campos aceita.
  def update? = pode?('admin.usuarios_gerenciar') || record == user
  def edit?   = update?

  def destroy?      = create? && record != user
  def toggle_ativo? = create? && record != user

  # Pode mexer no TIPO DE CONTA e no PERFIL DE ACESSO de alguém? Nunca no
  # próprio: senão qualquer usuário se promove editando a própria ficha.
  def alterar_acesso? = pode?('admin.usuarios_gerenciar') && record != user

  class Scope < Scope
    def resolve
      # Continua por papel: filtrar por permissão exigiria carregar o perfil de
      # cada linha (N+1) para responder algo que a policy já cobre na ação.
      if user.admin?
        scope.all
      elsif user.pode?('admin.usuarios')
        scope.where.not(role: :admin)
      else
        scope.where(id: user.id)
      end
    end
  end
end
