require 'rails_helper'

RSpec.describe Licitacao::ItemDoLote, type: :model do

	it { is_expected.to have_many(:itens_do_projeto_por_pessoa) }
	it { is_expected.to have_many(:itens_do_contrato) }
	# it { is_expected.to have_many(:itens_de_ordem_de_compra_diretas).class_name("Licitacao::ItemDaOrdemDeCompra") }

	it { is_expected.to belong_to(:lote) }
	it { is_expected.to belong_to(:item_do_pedido) }

	it { is_expected.to delegate_method(:projeto).to(:lote) }
	it { is_expected.to delegate_method(:descricao).to(:item_do_pedido) }
	it { is_expected.to delegate_method(:item).to(:item_do_pedido) }

	describe 'validate_uniqueness_of item_do_pedido_id' do
		it 'valida que cada item do pedido está em apenas um item do lote' do
			FactoryBot.create :licitacao_item_do_lote
			is_expected.to validate_uniqueness_of(:item_do_pedido_id).scoped_to(:lote_id)
		end
	end

	describe '#preco_unitario' do
		it 'retorna valor da proposta final' do
			proposta = FactoryBot.create :item_do_projeto_por_pessoa, final: true, preco: 15
			item_do_lote = proposta.item_do_lote
			expect(item_do_lote.preco_unitario).to eq 15
		end
	end

	describe '#saldo' do
		it 'retorna saldo de itens do lote' do
			pending("Implementar")
			fail
		end
	end

	describe '#possui_saldo?' do
		context 'quando o item do lote possui saldo' do
			it 'retorna true' do
				pending("Implementar")
				fail
			end
		end
		context 'quando o item do lote possui saldo' do
			it 'retorna false' do
				pending("Implementar")
				fail
			end
		end
	end

	describe '#saldo_em_porcentagem' do
		it 'retorna a porcentagem de itens a contratar' do
			pending("Implementar")
			fail
		end
	end

	describe '#quantidade_contratada' do
		it 'retorna quantos itens foram conratados' do
			pending("Implementar")
			fail
		end
	end

	describe '#quantidade_utilizada' do
		it 'retorna quantos itens foram contratados ou empenhados/liquidados diretamente' do
			pending("Implementar")
			fail
		end
	end

	describe '#porcentagem_do_valor_total_a_contratar' do
		it 'retorna a porcentagem de itens que foram contratados ou empenhados/liquidados diretamente' do
			pending("Implementar")
			fail
		end
	end

	describe '#total_contratado_por_unidade' do
		it 'retorna quantos itens do lote aquela unidade já contratou' do
			pending("Implementar")
			fail
		end
	end

	describe '#saldo_por_unidade' do
		it 'retorna saldo de itens de uma unidade orçamentária para aquele lote' do
			pending("Implementar")
			fail
		end
	end

	describe "#valor_total_por_unidade?" do
		it "retorna o valor total do item por unidade orçamentaria" do
			pending("implementar")
			fail
		end
	end

	describe "#itens_por_unidade?" do
		it "retorna a quantidade de itens por unidade orçamentaria" do
			pending("implementar")
			fail
		end
	end

	it 'atribui_ordem' do
		projeto = FactoryBot.create :licitacao_projeto, :por_lote
		lote = FactoryBot.create :licitacao_lote, projeto_id: projeto.id
		item_do_pedido = FactoryBot.create :item_do_pedido
		item_do_lote = lote.itens_do_lote.create(item_do_pedido: item_do_pedido)

		expect(item_do_lote.ordem).to eq 3
	end

	describe ':motivo_da_anulacao' do
		context 'com item válido' do
			subject { FactoryBot.build :licitacao_item_do_lote, anulado: false }
			it{ is_expected.to validate_absence_of :motivo_da_anulacao }
		end
		context 'com item anulado' do
			subject { FactoryBot.build :licitacao_item_do_lote, anulado: true }
			it{ is_expected.to validate_presence_of :motivo_da_anulacao }
		end
	end

	describe '#reordenar_lote' do
		context 'quando o um item do lote é apagado' do
			it 'reordena os outros itens' do
				pedido = FactoryBot.create :pedido, status: 'fechado'
				item_do_pedido_1 = FactoryBot.create(:item_do_pedido, pedido_id: pedido.id)
				item_do_pedido_2 = FactoryBot.create(:item_do_pedido, pedido_id: pedido.id)
				item_do_pedido_3 = FactoryBot.create(:item_do_pedido, pedido_id: pedido.id)

				projeto = FactoryBot.create :licitacao_projeto, :por_lote, pedido: pedido
				lote = FactoryBot.create :licitacao_lote, projeto_id: projeto.id

				_item_do_lote_1 = lote.itens_do_lote.create(item_do_pedido: item_do_pedido_1)
				item_do_lote_2 = lote.itens_do_lote.create(item_do_pedido: item_do_pedido_2)
				item_do_lote_3 = lote.itens_do_lote.create(item_do_pedido: item_do_pedido_3)

				item_do_lote_2.destroy
				expect(item_do_lote_3.reload.ordem).to eq 5
			end
		end
	end

	describe 'totalizadores' do
		before(:all) do
			DatabaseCleaner.strategy = :transaction
			DatabaseCleaner.start

			@pedido = FactoryBot.create :pedido, :fechado
		end
		after(:all) do
			DatabaseCleaner.clean
		end

		context '#valor_unitario' do
			it 'por_menor_preco' do
				projeto = FactoryBot.create :licitacao_projeto, pedido_id: @pedido.id, tipo_de_totalizacao: :menor_valor

				expect(projeto.lotes.first.itens_do_lote.first.valor_unitario.to_f).to eq 10
			end

			it 'por_valor_medio' do
				projeto = FactoryBot.create :licitacao_projeto, pedido_id: @pedido.id, tipo_de_totalizacao: :valor_medio

				expect(projeto.lotes.first.itens_do_lote.first.valor_unitario).to eq 15
			end
		end

		context '#valor_total' do
			it 'por_menor_preco' do
				projeto = FactoryBot.create :licitacao_projeto, pedido_id: @pedido.id, tipo_de_totalizacao: :menor_valor

				expect(projeto.lotes.first.itens_do_lote.first.valor_total).to eq 100
			end

			it 'por_valor_medio' do
				projeto = FactoryBot.create :licitacao_projeto, pedido_id: @pedido.id, tipo_de_totalizacao: :valor_medio

				expect(projeto.lotes.first.itens_do_lote.first.valor_total).to eq 150
			end
		end

	end

	describe '#anula_lote' do
		context 'quando é o ultimo item ativo de um lote e é anulado' do
			it 'anula o lote e retira seu numero' do
				lote = FactoryBot.create :licitacao_lote, numero: 1
				item_do_lote = FactoryBot.create :licitacao_item_do_lote, lote_id: lote.id
				expect(lote.anulado).to be_falsey
				expect(lote.numero).not_to be_nil
				item_do_lote.update(anulado: true, motivo_da_anulacao: "motivo convincente")
				lote = item_do_lote.lote
				expect(lote.numero).to be_nil
				expect(lote.anulado).to be_truthy
			end
		end
	end

	it 'gerou identificador' do
		item_do_lote = FactoryBot.create :licitacao_item_do_lote

		expect(item_do_lote.identificador).to be > 0
	end

end
