# app/services/analytics/resumo_operacao.rb
#
# Os números da operação num período, na forma que a mensagem agendada usa —
# as MESMAS chaves que Notificacao::Variaveis anuncia no editor para o gatilho
# `agendado`.
#
# Reusa OperacaoMetricas (visão Global) e NotasForaOperacao em vez de refazer as
# queries: se a regra de contagem mudar num lugar, o resumo enviado por WhatsApp
# não pode continuar dizendo outra coisa que o dashboard.
module Analytics
  class ResumoOperacao
    def initialize(inicio:, fim:)
      @inicio = inicio.to_date
      @fim    = fim.to_date
    end

    # Valores como TEXTO: eles vão direto para dentro de uma mensagem.
    def numeros
      {
        'operacao'      => rotulo_operacao,
        'entregues'     => metricas.sucesso.to_s,
        'recusas'       => metricas.recusas.to_s,
        'pendentes'     => metricas.pendentes.to_s,
        'retentativas'  => metricas.retentativas.to_s,
        'fora_operacao' => fora.total.to_s
      }
    end

    # Nada mudou no período? Evita mandar resumo zerado num feriado.
    def vazio?
      metricas.total.zero? && fora.total.zero?
    end

    private

    def tabelas = @tabelas ||= Operacao.nomes_validos

    def rotulo_operacao
      tabelas.size == 1 ? Operacao.label(tabelas.first) : "Todas as operações (#{tabelas.size})"
    end

    def metricas
      @metricas ||= OperacaoMetricas.new(tabelas: tabelas, inicio: @inicio, fim: @fim)
    end

    def fora
      @fora ||= NotasForaOperacao.new(inicio: @inicio, fim: @fim)
    end
  end
end
