require 'rails_helper'

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

	let(:processo) {
		FactoryBot.create :licitacao_processo, :por_lote, status: "em_sessao"
	}

	let(:lote){
		processo.lotes.first
	}

	describe 'validações' do
		it{ is_expected.to belong_to(:pessoa_do_projeto).class_name("Licitacao::PessoaDoProjeto").required }
		it{ is_expected.to belong_to(:lote).class_name("Licitacao::Lote").required }

		context 'quando lote é de melhor_tecnica' do
			subject {
				pessoa_do_lote = FactoryBot.create :pessoa_do_projeto_do_lote
				allow(pessoa_do_lote).to receive(:deve_receber_nota?) {true}
				allow(pessoa_do_lote).to receive(:nota_tecnica_changed?) {true}
				allow(pessoa_do_lote).to receive(:deve_receber_nota?) {true}
				pessoa_do_lote
			}
			it { is_expected.to validate_presence_of(:nota_tecnica).on(:update) }
			it { is_expected.to validate_numericality_of :nota_tecnica }
		end

		context 'quando lote é de menor preço' do
			subject {
				FactoryBot.build :pessoa_do_projeto_do_lote
			}
			it { is_expected.not_to validate_presence_of :nota_tecnica }
			it { is_expected.not_to validate_numericality_of :nota_tecnica }
		end
	end

	describe '#preenche_campo_habilitacao' do
		context 'quando processo é de dispensa ou inexigibilidade' do
			it 'atribui true para o campo de habilitacao' do
				processo = FactoryBot.create :licitacao_processo, :dispensa
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.new(projeto_id: processo.id)
				pessoa_do_projeto.save(validate: false)
				pessoa_do_lote = Licitacao::PessoaDoProjetoDoLote.create(pessoa_do_projeto_id: pessoa_do_projeto.id, lote_id: processo.lotes.first.id)
				expect(pessoa_do_lote.habilitado).to be_truthy
			end
		end
		Licitacao::Projeto.modalidades_de_licitacao.keys.reject{|k| k == "dispensa_ou_inexigibilidade"}.each do |modalidade|
			context "quando processo é de #{modalidade}" do
				it 'atribui false para o campo de habilitacao' do
					if modalidade == "convite"
						processo = FactoryBot.create :licitacao_processo, modalidade_de_licitacao: modalidade.to_sym , forma_de_agrupamento: "por_item"
					else
						processo = FactoryBot.build :licitacao_processo, modalidade_de_licitacao: modalidade.to_sym
						processo.save(validate: false)
					end
						pessoa_do_projeto = Licitacao::PessoaDoProjeto.new(projeto_id: processo.id)
						pessoa_do_projeto.save(validate: false)
						pessoa_do_lote = Licitacao::PessoaDoProjetoDoLote.new(pessoa_do_projeto: pessoa_do_projeto, lote_id: processo.lotes.first.id)
						pessoa_do_lote.validate
						expect(pessoa_do_lote.habilitado).to be_falsey
				end
			end
		end
	end

	describe '#inabilita_e_atualiza_ganhador' do
		it 'deve atualizar o ganhador' do
			lote.lances_abertos = true
			lote.save
			lote.reload
			primeira_rodada = FactoryBot.create(:licitacao_rodada, lote: lote)
			primeiro_licitante = primeira_rodada.lances.first.pessoa_do_projeto
			segundo_licitante = primeira_rodada.lances.second.pessoa_do_projeto
			primeira_rodada.lances.first.pessoa_do_projeto_id = primeiro_licitante.id
			primeira_rodada.lances.first.valor = 7.0
			primeira_rodada.lances.second.pessoa_do_projeto_id = segundo_licitante.id
			primeira_rodada.lances.second.valor = 11.0
			primeira_rodada.save
			primeira_rodada.reload
			segunda_rodada = primeira_rodada.lote.rodadas.last
			lance1 = segunda_rodada.lances.where(pessoa_do_projeto: primeiro_licitante).first
			lance1.valor = 6.0
			lance1.save(validate: false)
			lance2 = segunda_rodada.lances.where(pessoa_do_projeto: segundo_licitante).first
			lance2.desistir = true
			lance2.save(validate: false)
			segunda_rodada.reload
			segunda_rodada.desempate = true
			segunda_rodada.save(validate: false)

			#definindo ganhador
			lote.fechar_lances
			ganhador = lote.ganhador

			expect(ganhador).to eq primeiro_licitante

		end
	end

end
