require 'rails_helper'

RSpec.describe Licitacao::PessoasDoProjetoDoLoteController, type: :controller do
	sign_in_admin
	cria_configuracao_default
	set_licitacao_na_sessao

	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# Licitacao::Processo válido.

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

	let(:processo_com_melhor_tecnica) {
		FactoryBot.create :licitacao_processo, :melhor_tecnica, status: "em_sessao"
	}

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

	let(:pessoas_do_projeto){
		processo.reload
		processo.pessoas_do_projeto
	}

	describe "GET #edita_pessoas_do_projeto_do_lote" do
		context 'quando o critério de julgamento do processo não é "melhor_tecnica"' do
			it "retorna mensagem de erro" do
				get :edita_pessoas_do_projeto_do_lote, {lote_id: lote.to_param}
				expect(response).to redirect_to(licitacao_processo_path(processo) + "?tab=lotes")
				expect(flash[:alert]).to eq("O critério de julgamento do processo deve ser Melhor Técnica para esta ação")
			end
		end

		context "quando não possui licitantes" do
			it "retorna mensagem de erro" do
				lote = processo_com_melhor_tecnica.lotes.first
				lote.processo.pessoas_do_projeto.destroy_all
				get :edita_pessoas_do_projeto_do_lote, {lote_id: lote.to_param}
				expect(response).to redirect_to(licitacao_processo_path(lote.processo) + "?tab=lotes")
				expect(flash[:alert]).to eq("Adicione pelo menos um licitante para acessar a tela de nota técnica")
			end
		end

		context "quando não possui cotações para todos os itens do lote" do

			let(:lote){
				lote = processo_com_melhor_tecnica.lotes.first
				lote.processo.pessoas_do_projeto.first.itens_do_projeto_por_pessoa.clear
				lote.processo.pessoas_do_projeto.second.itens_do_projeto_por_pessoa.clear
				lote
			}

			context "e forma de agrupamento é global" do
				it "retorna mensagem de erro" do
					lote.reload
					lote.processo.global!
					get :edita_pessoas_do_projeto_do_lote, {lote_id: lote.to_param}
					expect(response).to redirect_to(licitacao_processo_path(lote.processo) + "?tab=lotes")
					expect(flash[:alert]).to eq("Todos os itens devem ter propostas preenchidas")
				end
			end

			context "e forma de agrupamento é por item" do
				it "retorna mensagem de erro" do
					lote.processo.por_item!
					get :edita_pessoas_do_projeto_do_lote, {lote_id: lote.to_param}
					expect(response).to redirect_to(licitacao_processo_path(lote.processo) + "?tab=lotes")
					expect(flash[:alert]).to eq("Nenhuma empresa preencheu proposta para este item")
				end
			end

			context "e forma de agrupamento é por lote" do
				it "retorna mensagem de erro" do
					lote.processo.por_lote!
					get :edita_pessoas_do_projeto_do_lote, {lote_id: lote.to_param}
					expect(response).to redirect_to(licitacao_processo_path(lote.processo) + "?tab=lotes")
					expect(flash[:alert]).to eq("Nem todos os itens do lote tem proposta preenchida")
				end
			end
		end

		context 'quando o critério de julgamento do processo é "melhor_tecnica"' do
			it "atribui o(a) lote requisitado à @lote" do
				lote = processo_com_melhor_tecnica.lotes.first
				get :edita_pessoas_do_projeto_do_lote, {lote_id: lote.to_param}
				expect(assigns(:lote)).to eq(lote)
			end
		end
	end

	describe 'PATCH #update' do
		context "com parâmetros válidos" do
			it 'atualiza o lote com pessoas_do_projeto_do_lote' do
				pessoas_do_lote = lote.pessoas_do_projeto_do_lote
				hash_atributos_pessoas_do_projeto_do_lote = {
						pessoas_do_projeto_do_lote_attributes: {
								'0': { id: pessoas_do_lote.first.id, pessoa_do_projeto_id: pessoas_do_lote.first.pessoa_do_projeto.id, lote_id: lote.id, nota_tecnica: 10 },
								'1': { id: pessoas_do_lote.second.id, pessoa_do_projeto_id: pessoas_do_lote.second.pessoa_do_projeto.id, lote_id: lote.id, nota_tecnica: 9 }
						}
				}
				patch :update, {lote_id: lote.id.to_param, licitacao_lote: hash_atributos_pessoas_do_projeto_do_lote}
				lote.reload
				expect(lote.pessoas_do_projeto_do_lote.size).to eq 2
				expect(lote.pessoas_do_projeto.size).to eq 2
				expect(lote.pessoas_do_projeto.first.pessoa.nome).to eq "Antonio de Sousa"
				expect(lote.processo.pessoas_do_projeto).to eq lote.pessoas_do_projeto
			end
		end

		context "com parâmetros inválidos" do
			it 're-renderiza o template :edita_pessoas_do_projeto_do_lote' do
				lote_melhor_tecnica = processo_com_melhor_tecnica.lotes.create(FactoryBot.attributes_for :licitacao_lote, lances_abertos: false)
				FactoryBot.create_list(:licitacao_item_do_lote, 2, lote_id: lote_melhor_tecnica.id)
				processo_com_melhor_tecnica.pessoas_do_projeto.create!(pessoa_id: FactoryBot.create(:pessoa_juridica).id)
				allow_any_instance_of(Licitacao::PessoaDoProjetoDoLote).to receive(:deve_receber_nota?).and_return(true)

				hash_atributos_pessoas_do_projeto_do_lote = {
						pessoas_do_projeto_do_lote_attributes: {
								'0': { pessoa_do_projeto_id: processo_com_melhor_tecnica.pessoas_do_projeto.first.id, lote_id: lote_melhor_tecnica.id, nota_tecnica: nil }
						}
				}
				patch :update, {lote_id: lote_melhor_tecnica.id.to_param, licitacao_lote: hash_atributos_pessoas_do_projeto_do_lote}
				expect(response).to render_template("edita_pessoas_do_projeto_do_lote")
			end
		end
	end

	describe "GET #edita_justificativa" do
		it "atribui o(a) lote requisitado à @lote" do
			lote = processo_com_melhor_tecnica.lotes.first
			pessoa_do_projeto = lote.pessoas_do_projeto.first
			pessoa_do_projeto_do_lote = Licitacao::PessoaDoProjetoDoLote.find_by(lote_id: lote.id, pessoa_do_projeto_id: pessoa_do_projeto.id)
			get :edita_justificativa, {lote_id: lote.to_param,  pessoa_do_projeto_do_lote_id: pessoa_do_projeto_do_lote.to_param}
			expect(assigns(:lote)).to eq(lote)
			expect(assigns(:pessoa_do_projeto_do_lote)).to eq(pessoa_do_projeto_do_lote)
		end

		context 'quando o licitante já está inabilitado com justificativa' do
			it "retorna mensagem de erro" do
				lote = processo_com_melhor_tecnica.lotes.first
				pessoa_do_projeto = lote.pessoas_do_projeto.first
				pessoa_do_projeto_do_lote = Licitacao::PessoaDoProjetoDoLote.find_by(lote_id: lote.id, pessoa_do_projeto_id: pessoa_do_projeto.id)
				pessoa_do_projeto_do_lote.update(justificativa: 'Inabilitado por algum motivo')
				get :edita_justificativa, {lote_id: lote.to_param, pessoa_do_projeto_do_lote_id: pessoa_do_projeto_do_lote.to_param}
				lote.reload
				expect(response).to redirect_to(licitacao_processo_path(lote.processo) + "?tab=lotes")
				expect(lote.status).to eq('fracassado')
				expect(flash[:alert]).to eq("Não há mais licitantes habilitados para ser o novo ganhador, lote está fracassado")
			end
		end
	end

	describe 'PATCH #inabilita' do
		context "com parâmetros válidos" do
			it 'atualiza pessoas_do_projeto_do_lote' do
				pessoa_do_lote = lote.pessoas_do_projeto_do_lote.first
				pessoa_do_lote.update(habilitado: true)
				patch :inabilita, {lote_id: lote.id.to_param, licitacao_pessoa_do_projeto_do_lote: {justificativa: 'Justificativa teste', id: pessoa_do_lote.id}}
				expect(response).to redirect_to(licitacao_processo_path(lote.processo) + "?tab=lotes")
				pessoa_do_lote.reload
				expect(pessoa_do_lote.justificativa).to eq 'Justificativa teste'
				expect(pessoa_do_lote.habilitado).to be_falsey
			end
		end
	end

end
