# app/models/consolidacao_motorista.rb
class ConsolidacaoMotorista < ApplicationRecord
  # Nome da tabela fixado: o inflector pt-BR (config/initializers/inflections.rb)
  # pode resolver o composto "consolidacao_motorista" no singular errado.
  self.table_name = 'consolidacao_motoristas'

  belongs_to :consolidacao
  belongs_to :pagador,    class_name: 'User', foreign_key: :pago_por,      optional: true
  belongs_to :arquivador, class_name: 'User', foreign_key: :arquivado_por, optional: true
  has_many   :consolidacao_entregas,
             ->(cm) { where(motorista_nome: cm.motorista_nome) },
             foreign_key: :consolidacao_id,
             primary_key: :consolidacao_id

  validates :motorista_nome, presence: true
  validates :motorista_nome, uniqueness: { scope: :consolidacao_id }

  before_save :recalcular_valor

  # ── Pagamento ───────────────────────────────────────────────
  scope :pagos,     -> { where.not(pago_em: nil) }
  scope :pendentes, -> { where(pago_em: nil) }

  # ── Arquivamento (reversível) ───────────────────────────────
  # Um motorista arquivado sai dos totais/pagamento/gate da consolidação, mas
  # os dados são mantidos e podem ser restaurados.
  scope :ativos,     -> { where(arquivado_em: nil) }
  scope :arquivados, -> { where.not(arquivado_em: nil) }

  def arquivado?
    arquivado_em.present?
  end

  # update_columns: não dispara o before_save :recalcular_valor (que recalcula o
  # valor do PRÓPRIO motorista). O total da CONSOLIDAÇÃO é recalculado pelo
  # controller, que só soma os motoristas ativos.
  def arquivar!(user)
    update_columns(arquivado_em: Time.current, arquivado_por: user&.id, updated_at: Time.current)
  end

  def desarquivar!(_user)
    update_columns(arquivado_em: nil, arquivado_por: nil, updated_at: Time.current)
  end

  def pago?
    pago_em.present?
  end

  def marcar_pago!(user, forma:, nota_fiscal:)
    update!(pago_em: Time.current, pago_por: user&.id, forma_pagamento: forma,
            nota_fiscal: nota_fiscal)
  end

  def cancelar_pagamento!(_user)
    update!(pago_em: nil, pago_por: nil, forma_pagamento: nil, nota_fiscal: nil)
  end

  def recalcular_valor
    # Fonte única de verdade: o valor_aplicado capturado no momento da
    # classificação (igual ao ConsolidacaoEntregasController#recalcular_motorista).
    # Recalcular pelos preços atuais de Configuracao divergiria caso os preços
    # mudassem depois das entregas já terem sido classificadas.
    self.valor_total = consolidacao_entregas
      .where(motorista_nome: motorista_nome)
      .sum { |e| e.desconto? ? -e.valor_aplicado : e.valor_aplicado }
  end
end
