require 'rails_helper'

# Os nomes aqui são os REAIS, lidos da tela de Planos do SimpliRoute
# (Imagens para correção/Imagem colada (11).png) e do cabeçalho do romaneio do
# programa antigo: "ENTREGAS EMAD 09.2026", "UBS SUL E LESTE AGOSTO 2026",
# "AVULSAS 3 EMAD/SUDESTE AGOSTO 2026". As três diferenças que quebram uma
# comparação de texto — conectivo "E", mês abreviado x por extenso, e mês
# NUMÉRICO ("09.2026") — estão todas cobertas.
RSpec.describe Romaneios::CasadorDeOperacao do
  # Lista fixa: o teste é do CASAMENTO, não do catálogo do banco.
  let(:tabelas) do
    %w[
      gade_entregas_emad_ago_2026
      gade_entregas_emad_set_2026
      gade_entregas_ubs_sul_leste_ago_2026
      gade_entregas_ubs_norte_ago_2026
      gade_entregas_ubs_oeste_ago_2026
      gade_entregas_avulsas_3_emad_sudeste_ago_2026
      gade_entregas_sudeste_julho_2026
    ]
  end

  def casar(nome) = described_class.casar(nome, tabelas: tabelas)

  it 'casa o mês NUMÉRICO do plano com o mês abreviado da tabela' do
    # "09" só é lido como mês por vir colado ao ano — ver o "3" de AVULSAS abaixo.
    expect(casar('ENTREGAS EMAD 09.2026')).to eq('gade_entregas_emad_set_2026')
  end

  it 'casa o mês por extenso com a abreviação da tabela' do
    expect(casar('EMAD SETEMBRO 2026')).to eq('gade_entregas_emad_set_2026')
    expect(casar('EMAD AGOSTO 2026')).to eq('gade_entregas_emad_ago_2026')
  end

  it 'ignora o conectivo "E", que existe no plano e não no nome da tabela' do
    expect(casar('UBS SUL E LESTE AGOSTO 2026')).to eq('gade_entregas_ubs_sul_leste_ago_2026')
  end

  it 'não confunde UBS de regiões diferentes no mesmo mês' do
    expect(casar('UBS NORTE AGOSTO 2026')).to eq('gade_entregas_ubs_norte_ago_2026')
    expect(casar('UBS OESTE AGOSTO 2026')).to eq('gade_entregas_ubs_oeste_ago_2026')
  end

  it 'trata a barra como separador e não lê o "3" de AVULSAS como março' do
    expect(casar('AVULSAS 3 EMAD/SUDESTE AGOSTO 2026'))
      .to eq('gade_entregas_avulsas_3_emad_sudeste_ago_2026')
  end

  it 'não depende de maiúsculas nem de acento' do
    expect(casar('entregas emad 09.2026')).to eq('gade_entregas_emad_set_2026')
  end

  # ── O que NÃO pode casar ──────────────────────────────────────────────────
  # Vincular a operação errada é pior do que não vincular: APARELHO e TELEFONE
  # sairiam preenchidos com dados de OUTRO mês e ninguém desconfiaria.
  it 'devolve nil quando o mês não tem tabela' do
    expect(casar('EMAD DEZEMBRO 2026')).to be_nil
  end

  it 'devolve nil quando o mês bate mas a operação não existe' do
    expect(casar('CARDIOLOGIA AGOSTO 2026')).to be_nil
  end

  it 'devolve nil com nome vazio' do
    expect(casar('')).to be_nil
  end

  it 'devolve nil (e diz o motivo) quando duas operações empatam' do
    resultado = described_class.new(
      'EMAD AGOSTO 2026',
      tabelas: %w[gade_entregas_emad_ago_2026 gade_entregas_emad_agosto_2026]
    ).resultado

    expect(resultado.tabela).to be_nil
    expect(resultado.confianca).to eq(:ambigua)
    expect(resultado.motivo).to include('escolha na lista')
  end
end
