require 'rails_helper'

RSpec.describe ConsolidacaoVeiculo, type: :model do
  let(:consolidacao) { create(:consolidacao) }

  describe 'validações' do
    it 'exige motorista_nome e vehicle' do
      expect(build(:consolidacao_veiculo, motorista_nome: nil)).not_to be_valid
      expect(build(:consolidacao_veiculo, vehicle: nil)).not_to be_valid
    end

    it 'não permite o mesmo veículo duas vezes para o mesmo motorista' do
      create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
      dup = build(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
      expect(dup).not_to be_valid
    end
  end

  describe '#recalcular_valor (before_save)' do
    before do
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    vehicle: 'GADE_1', tipo: :entrega_normal, valor_aplicado: 15)
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    vehicle: 'GADE_1', tipo: :desconto, valor_aplicado: 5)
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    vehicle: 'GADE_2', tipo: :entrega_normal, valor_aplicado: 99)
    end

    it 'soma só os pilares do veículo e trata desconto como negativo' do
      cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'Joao', vehicle: 'GADE_1')
      expect(cv.valor_total).to eq(10) # 15 - 5 (GADE_2 fica de fora)
    end

    it 'o bucket "(sem veículo)" casa pilares com vehicle NULL/vazio' do
      create(:consolidacao_entrega, consolidacao: consolidacao, motorista_nome: 'Joao',
                                    vehicle: nil, tipo: :bonus, valor_aplicado: 7)
      cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'Joao',
                                         vehicle: ConsolidacaoVeiculo::SEM_VEICULO)
      expect(cv.valor_total).to eq(7)
    end
  end

  describe 'fechamento e arquivamento' do
    let(:gerente) { create(:gerente) }

    it 'fecha e reabre registrando quem/quando' do
      cv = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
      expect(cv).not_to be_fechado

      cv.fechar!(gerente)
      cv.reload
      expect(cv).to be_fechado
      expect(cv.fechado_por).to eq(gerente.id)
      expect(cv.fechado_em).to be_present

      cv.reabrir!(gerente)
      expect(cv.reload).not_to be_fechado
    end

    it 'arquiva e desarquiva, e os escopos separam os estados' do
      aberto    = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'A', vehicle: 'GADE_1')
      fechado   = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'B', vehicle: 'GADE_2')
      arquivado = create(:consolidacao_veiculo, consolidacao: consolidacao, motorista_nome: 'C', vehicle: 'GADE_3')
      fechado.fechar!(gerente)
      arquivado.arquivar!(gerente)

      expect(ConsolidacaoVeiculo.fechados).to include(fechado)
      expect(ConsolidacaoVeiculo.fechados).not_to include(aberto)
      expect(ConsolidacaoVeiculo.abertos).to include(aberto)
      expect(ConsolidacaoVeiculo.ativos).not_to include(arquivado)
      expect(ConsolidacaoVeiculo.arquivados).to contain_exactly(arquivado)
    end
  end
end
