require 'rails_helper'

RSpec.describe Notificacao::Whatsapp do
  let(:config) { ConfiguracaoNotificacao.new(whatsapp_ativo: true) }

  it 'recusa número que não dá para normalizar, sem chamar provedor nenhum' do
    expect(described_class).not_to receive(:via_baileys)
    resposta = described_class.enviar(para: '123', texto: 'oi', config: config)

    expect(resposta).not_to be_ok
    expect(resposta.erro).to include('inválido')
  end

  it 'usa a ponte Baileys quando o provedor é baileys' do
    config.whatsapp_provedor = 'baileys'
    ponte = instance_double(Notificacao::ClienteWhatsapp,
                            enviar: Notificacao::ClienteWhatsapp::Resposta.new(ok: true))
    allow(Notificacao::ClienteWhatsapp).to receive(:padrao).and_return(ponte)

    expect(described_class.enviar(para: '(11) 92005-1157', texto: 'oi', config: config)).to be_ok
    expect(ponte).to have_received(:enviar).with(para: '+5511920051157', texto: 'oi')
  end

  it 'devolve erro em vez de levantar quando o Twilio falha' do
    config.whatsapp_provedor = 'twilio'
    allow(config).to receive(:credenciais_whatsapp)
      .and_return({ sid: 'AC1', token: 'x', from: 'whatsapp:+5511000000000' })
    allow(Notificacao::ClienteTwilio).to receive(:montar).and_raise(StandardError, 'rede fora')

    resposta = described_class.enviar(para: '(11) 92005-1157', texto: 'oi', config: config)

    expect(resposta).not_to be_ok
    expect(resposta.erro).to include('rede fora')
  end
end

RSpec.describe Notificacao::Whatsapp, 'grupo do WhatsApp' do
  let(:jid) { '120363012345678901@g.us' }

  it 'manda o JID cru para a ponte, sem tentar normalizar como telefone' do
    config = ConfiguracaoNotificacao.new(whatsapp_ativo: true, whatsapp_provedor: 'baileys')
    ponte = instance_double(Notificacao::ClienteWhatsapp,
                            enviar: Notificacao::ClienteWhatsapp::Resposta.new(ok: true))
    allow(Notificacao::ClienteWhatsapp).to receive(:padrao).and_return(ponte)

    expect(described_class.enviar(para: jid, texto: 'oi', config: config)).to be_ok
    expect(ponte).to have_received(:enviar).with(para: jid, texto: 'oi')
  end

  it 'recusa com mensagem clara quando o provedor é Twilio' do
    config = ConfiguracaoNotificacao.new(whatsapp_ativo: true, whatsapp_provedor: 'twilio')

    resposta = described_class.enviar(para: jid, texto: 'oi', config: config)

    expect(resposta).not_to be_ok
    expect(resposta.erro).to include('grupo')
  end
end
