# app/models/operacao_snapshot.rb
#
# Últimos números conhecidos de uma operação. Comparar com os de agora é o que
# permite dizer O QUE mudou — e não só como está.
class OperacaoSnapshot < ApplicationRecord
  CONTADORES = %i[total_notas entregues nao_entregues pendentes].freeze

  ROTULOS = {
    total_notas:   'notas na operação',
    entregues:     'entregues',
    nao_entregues: 'não entregues',
    pendentes:     'em aberto'
  }.freeze

  validates :tabela, presence: true, uniqueness: true

  def self.para(tabela) = find_or_initialize_by(tabela: tabela.to_s)

  def numeros = CONTADORES.index_with { |c| send(c).to_i }

  # Diferença legível entre o retrato guardado e os números de agora:
  # { total_notas: +3, pendentes: -1 } => "3 notas na operação a mais, 1 em aberto a menos"
  def diferenca(atuais)
    CONTADORES.filter_map do |contador|
      delta = atuais[contador].to_i - send(contador).to_i
      next if delta.zero?

      [contador, delta]
    end.to_h
  end

  def self.descrever(diferenca)
    diferenca.map do |contador, delta|
      "#{delta.abs} #{ROTULOS.fetch(contador, contador)} #{delta.positive? ? 'a mais' : 'a menos'}"
    end.join(', ')
  end

  def registrar!(atuais)
    update!(atuais.merge(capturado_em: Time.current))
  end
end
