# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include Pundit::Authorization
  include Pagy::Backend

  before_action :authenticate_user!
  before_action :set_tema
  before_action :preparar_splash

  # Pundit: redireciona se não autorizado.
  #
  # ⚠️ NÃO redirecione para `root_path` aqui: a raiz é o dashboard, e um perfil
  # sem `dashboard.ver` entraria em loop (nega → raiz → nega). O destino é a
  # primeira tela que a PESSOA pode abrir; quem não pode abrir nenhuma vai para a
  # tela de sem-acesso, que explica a quem pedir.
  rescue_from Pundit::NotAuthorizedError do |_e|
    flash[:alert] = 'Você não tem permissão para acessar essa área.'
    redirect_to destino_permitido
  end

  private

  # Rota inicial deste usuário (ver User#home_rota). `sem_acesso_path` é o fim de
  # linha: perfil sem nenhuma permissão.
  def destino_permitido
    rota = current_user&.home_rota
    return sem_acesso_path if rota.nil?

    # Evita loop quando a própria tela negada é a home calculada.
    destino = public_send(rota)
    destino == request.path ? sem_acesso_path : destino
  end
  helper_method :destino_permitido

  def set_tema
    @tema = current_user&.tema_preferido || 'dark'
  end

  # Mostra a animação de abertura uma única vez, na primeira página HTML após o
  # login. O flag é gravado em #after_sign_in_path_for (Devise) e nos logins do
  # motorista (PIN/QR); aqui ele é lido e apagado (one-shot).
  def preparar_splash
    return unless request.get? && request.format.html?

    @mostrar_splash = session.delete(:mostrar_splash)
  end

  # Mesma regra do Users::SessionsController: o destino é a primeira tela que o
  # PERFIL da pessoa permite, não uma rota fixa por papel.
  def after_sign_in_path_for(resource)
    session[:mostrar_splash] = true
    rota = resource.home_rota
    rota ? public_send(rota) : sem_acesso_path
  end
end
