# app/controllers/admin/configuracao_notificacoes_controller.rb
#
# Tela única (singleton) de SMTP + WhatsApp. Só admin — ver
# ConfiguracaoNotificacaoPolicy.
class Admin::ConfiguracaoNotificacoesController < ApplicationController
  before_action :set_config

  CAMPOS = %i[
    smtp_ativo smtp_address smtp_port smtp_username smtp_password smtp_domain
    smtp_autenticacao remetente_email remetente_nome
    email_notificacoes_ativo email_admin
    whatsapp_ativo whatsapp_provedor whatsapp_intervalo_segundos whatsapp_admin
    twilio_account_sid twilio_auth_token twilio_from
    baileys_url baileys_token
  ].freeze

  def show
    authorize @config
  end

  # PATCH /admin/configuracao_notificacao
  #
  # Os botões "enviar teste" são submits DESTE MESMO form, diferenciados por
  # params[:acao]. Assim o teste sempre usa o que está na tela — evita o
  # clássico "digitei a senha nova, cliquei em testar, e ele testou a antiga".
  def update
    authorize @config

    antes = resumo

    unless @config.update(config_params)
      flash.now[:alert] = @config.errors.full_messages.to_sentence
      return render(:show, status: :unprocessable_entity)
    end

    auditar!(antes)

    case params[:acao]
    when 'testar_email'
      redirecionar(Notificacao::TesteEmail.new(@config, usuario: current_user).executar)
    when 'testar_whatsapp'
      redirecionar(Notificacao::TesteWhatsapp.new(@config).executar)
    else
      redirect_to admin_configuracao_notificacao_path,
                  notice: 'Configurações de notificação salvas.'
    end
  end

  private

  def set_config
    @config = ConfiguracaoNotificacao.instancia
  end

  def redirecionar(resultado)
    redirect_to admin_configuracao_notificacao_path, **resultado.para_flash
  end

  def config_params
    permitidos = params.require(:configuracao_notificacao).permit(*CAMPOS)
    # Campo de senha em branco significa "mantenha a que já está gravada" — a
    # tela nunca exibe o valor, então salvar sem redigitar não pode apagá-lo.
    permitidos.delete(:smtp_password)     if permitidos[:smtp_password].blank?
    permitidos.delete(:twilio_auth_token) if permitidos[:twilio_auth_token].blank?
    permitidos.delete(:baileys_token)      if permitidos[:baileys_token].blank?
    permitidos
  end

  # ⚠️ NUNCA colocar senha ou token aqui: AuditoriaLog#dados_novos é exibido em
  #    /admin/auditoria_logs, que gerente também acessa. Só o booleano de
  #    "está definida ou não".
  def resumo
    {
      smtp_ativo:               @config.smtp_ativo,
      smtp_address:             @config.smtp_address,
      smtp_port:                @config.smtp_port,
      smtp_username:            @config.smtp_username,
      smtp_domain:              @config.smtp_domain,
      smtp_autenticacao:        @config.smtp_autenticacao,
      remetente_email:          @config.remetente_email,
      remetente_nome:           @config.remetente_nome,
      email_admin:              @config.email_admin,
      email_notificacoes_ativo: @config.email_notificacoes_ativo,
      whatsapp_ativo:           @config.whatsapp_ativo,
      whatsapp_provedor:        @config.whatsapp_provedor,
      whatsapp_intervalo:       @config.whatsapp_intervalo_segundos,
      twilio_account_sid:       @config.twilio_account_sid,
      twilio_from:              @config.twilio_from,
      whatsapp_admin:           @config.whatsapp_admin,
      baileys_url:              @config.baileys_url,
      smtp_password_definida:      @config.smtp_password?,
      twilio_auth_token_definido:  @config.twilio_auth_token?,
      baileys_token_definido:      @config.baileys_token?
    }
  end

  def auditar!(antes)
    AuditoriaLog.registrar(
      user:             current_user,
      acao:             'editar_notificacoes',
      entidade:         'ConfiguracaoNotificacao',
      entidade_id:      @config.id,
      dados_anteriores: antes,
      dados_novos:      resumo,
      request:          request
    )
  end
end
