# app/controllers/admin/whatsapp_sessoes_controller.rb
#
# Pareamento do WhatsApp por QR code (ponte Baileys, container `whatsapp`).
#
# ⚠️ Canal NÃO OFICIAL: parear liga o número da empresa a este servidor por uma
#    sessão do WhatsApp Web obtida por engenharia reversa. Está fora dos Termos
#    do WhatsApp e a Meta pode banir o número — use um chip dedicado. A tela
#    avisa isso em texto, não só no código.
class Admin::WhatsappSessoesController < ApplicationController
  def show
    authorize :whatsapp_sessao, :show?
    @config  = ConfiguracaoNotificacao.instancia
    @cliente = Notificacao::ClienteWhatsapp.padrao
    @estado  = consultar
  end

  # Polling da tela enquanto o QR não é lido — o QR expira em ~20s e a ponte
  # gera outro, então a página precisa buscar o novo sozinha.
  def status
    authorize :whatsapp_sessao, :show?
    render json: consultar
  end

  def testar
    authorize :whatsapp_sessao, :testar?

    destino = ConfiguracaoNotificacao.normalizar_telefone(params[:numero])
    if destino.blank?
      return redirect_to(admin_whatsapp_sessao_path, alert: 'Informe um número válido (DDD + número).')
    end

    resposta = Notificacao::ClienteWhatsapp.padrao.enviar(
      para: destino,
      texto: "Teste do Reem Notas ✅\nSe você recebeu isto, o WhatsApp está conectado."
    )

    if resposta.ok?
      redirect_to admin_whatsapp_sessao_path, notice: "Mensagem de teste enviada para #{destino}."
    else
      redirect_to admin_whatsapp_sessao_path, alert: "Falhou: #{resposta.erro}"
    end
  end

  def desconectar
    authorize :whatsapp_sessao, :desconectar?

    resposta = Notificacao::ClienteWhatsapp.padrao.desconectar
    AuditoriaLog.registrar(user: current_user, acao: 'whatsapp_desconectar',
                           entidade: 'ConfiguracaoNotificacao',
                           dados_novos: { detalhes: 'Desconectou a sessão do WhatsApp' },
                           request: request)

    if resposta.ok?
      ConfiguracaoNotificacao.instancia.update_columns(whatsapp_numero_conectado: nil,
                                                       whatsapp_conectado_em: nil)
      redirect_to admin_whatsapp_sessao_path, notice: 'Sessão encerrada. Leia o QR para conectar de novo.'
    else
      redirect_to admin_whatsapp_sessao_path, alert: "Não foi possível desconectar: #{resposta.erro}"
    end
  end

  private

  # Consulta a ponte e memoriza o número conectado no banco — assim a tela de
  # configuração mostra quem está pareado mesmo com a ponte fora do ar.
  def consultar
    resposta = Notificacao::ClienteWhatsapp.padrao.status
    return { 'conectado' => false, 'erro' => resposta.erro } unless resposta.ok?

    dados = resposta.dados || {}
    if dados['conectado'] && dados['numero'].present?
      config = ConfiguracaoNotificacao.instancia
      if config.whatsapp_numero_conectado != dados['numero']
        config.update_columns(whatsapp_numero_conectado: dados['numero'],
                              whatsapp_conectado_em: Time.current)
      end
    end
    dados
  end
end
