# app/services/notificacao/variaveis.rb
#
# Quais {{variaveis}} existem em cada gatilho, o que elas significam e um valor
# de AMOSTRA para o preview do editor.
#
# A amostra é o que faz o preview valer alguma coisa: mostrar "{{valor}}" cru na
# tela não diz se a mensagem ficou boa. Aqui ela é um exemplo plausível, não um
# dado real do banco — o preview não deve depender de haver consolidação
# fechada no ambiente para funcionar.
module Notificacao
  module Variaveis
    # Disponíveis em qualquer evento.
    COMUNS = {
      'empresa'  => { descricao: 'Nome da empresa',        amostra: 'Reem Transportes' },
      'data'     => { descricao: 'Data de hoje',           amostra: '24/08/2026' },
      'contato'  => { descricao: 'Primeiro nome de quem recebe', amostra: 'Carlos' }
    }.freeze

    # Gatilhos que falam de um fechamento/pagamento de motorista.
    FECHAMENTO = {
      'motorista'    => { descricao: 'Nome do motorista',            amostra: 'Carlos Matheus Pimentel' },
      'consolidacao' => { descricao: 'Nome da consolidação',         amostra: 'UBS NORTE 01–14/08' },
      'periodo'      => { descricao: 'Período do fechamento',        amostra: '01/08/2026 a 14/08/2026' },
      'valor'        => { descricao: 'Valor do motorista',           amostra: 'R$ 5.060,00' },
      'entregas'     => { descricao: 'Entregas atendidas',           amostra: '280' },
      'link_painel'  => { descricao: 'Link do painel do motorista',  amostra: 'https://app.reem.com.br/motorista' }
    }.freeze

    POR_GATILHO = {
      'manual' => {},
      'consolidacao_finalizada' => FECHAMENTO,
      'pagamento_efetuado'      => FECHAMENTO,
      'valor_alterado' => FECHAMENTO.merge(
        'o_que_mudou' => { descricao: 'O que foi alterado', amostra: 'Desconto de R$ 120,00 aplicado (avaria)' }
      ),
      'operacao_alterada' => {
        'operacao'    => { descricao: 'Operação afetada',   amostra: 'UBS NORTE AGO 2026' },
        'o_que_mudou' => { descricao: 'O que foi alterado', amostra: '3 NFs entraram, 1 saiu' },
        'nf'          => { descricao: 'Nota fiscal',        amostra: '85382' }
      },
      'agendado' => {
        'operacao'      => { descricao: 'Operação',                    amostra: 'UBS NORTE AGO 2026' },
        'periodo'       => { descricao: 'Período do resumo',           amostra: '01/08/2026 a 24/08/2026' },
        'entregues'     => { descricao: 'Notas entregues',             amostra: '4.851' },
        'recusas'       => { descricao: 'Notas não entregues',         amostra: '122' },
        'pendentes'     => { descricao: 'Notas em aberto',             amostra: '0' },
        'retentativas'  => { descricao: 'Visitas além da primeira',    amostra: '4' },
        'fora_operacao' => { descricao: 'Notas fora da operação',      amostra: '2' }
      }
    }.freeze

    def self.para(gatilho)
      COMUNS.merge(POR_GATILHO.fetch(gatilho.to_s, {}))
    end

    def self.nomes(gatilho) = para(gatilho).keys

    # { 'valor' => 'R$ 5.060,00', ... } — o contexto do PREVIEW.
    #
    # ⚠️ Só para preview. Num envio de verdade a amostra colocaria uma data fixa
    #    e um valor inventado dentro da mensagem que o contato recebe.
    def self.amostra(gatilho)
      para(gatilho).transform_values { |meta| meta[:amostra] }
    end

    # Valores REAIS das variáveis comuns — o que um envio de verdade deve usar
    # quando o gatilho não traz contexto próprio (ex.: disparo manual).
    def self.comuns_reais
      {
        'empresa' => Configuracao.valor('empresa_nome').presence || 'Reem Transportes',
        'data'    => Date.current.strftime('%d/%m/%Y')
      }
    rescue StandardError
      # Tabela de configuração indisponível não pode impedir um disparo.
      { 'data' => Date.current.strftime('%d/%m/%Y') }
    end
  end
end
