require 'rails_helper'

RSpec.describe ConsolidacaoMotorista, type: :model do
  describe 'validações' do
    it 'exige motorista_nome' do
      expect(build(:consolidacao_motorista, motorista_nome: nil)).not_to be_valid
    end

    it 'não permite o mesmo motorista duas vezes na consolidação' do
      consolidacao = create(:consolidacao)
      create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
      dup = build(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
      expect(dup).not_to be_valid
    end
  end

  describe '#recalcular_valor (fonte única: valor_aplicado)' do
    let(:consolidacao) { create(:consolidacao) }

    before do
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    tipo: :entrega_normal, valor_aplicado: 15)
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    tipo: :bonus, valor_aplicado: 10)
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    tipo: :desconto, valor_aplicado: 5)
    end

    it 'soma usando valor_aplicado e trata desconto como negativo' do
      cm = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
      # 15 + 10 - 5 = 20
      expect(cm.valor_total).to eq(20)
    end

    it 'NÃO recalcula pelos preços atuais de Configuracao' do
      # Mesmo que os preços de Configuracao mudem, o total usa o valor_aplicado capturado.
      allow(Configuracao).to receive(:preco_entrega).and_return(999)
      cm = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
      expect(cm.valor_total).to eq(20)
    end

    it 'considera apenas as entregas do próprio motorista' do
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Maria',
                                    tipo: :entrega_normal, valor_aplicado: 100)
      cm = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao')
      expect(cm.valor_total).to eq(20)
    end
  end

  describe 'arquivamento (reversível)' do
    let(:consolidacao) { create(:consolidacao) }
    let(:gerente)      { create(:gerente) }
    let(:cm)           { create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Joao') }

    it 'arquivar!/desarquivar! alternam arquivado? e registram quem arquivou' do
      expect(cm.arquivado?).to be false
      cm.arquivar!(gerente)
      expect(cm.reload.arquivado?).to be true
      expect(cm.arquivado_por).to eq(gerente.id)
      expect(cm.arquivado_em).to be_present

      cm.desarquivar!(gerente)
      expect(cm.reload.arquivado?).to be false
      expect(cm.arquivado_em).to be_nil
    end

    it 'scopes ativos/arquivados separam corretamente' do
      ativo     = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Ativo')
      arquivado = create(:consolidacao_motorista, consolidacao: consolidacao, motorista_nome: 'Arquivado')
      arquivado.arquivar!(gerente)

      expect(ConsolidacaoMotorista.ativos).to include(ativo)
      expect(ConsolidacaoMotorista.ativos).not_to include(arquivado)
      expect(ConsolidacaoMotorista.arquivados).to contain_exactly(arquivado)
    end
  end
end
