require 'rails_helper'


RSpec.describe Licitacao::PessoasDoProjetoController, 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::PessoaDoProjeto válido.

	let(:atributos_validos) {
		FactoryBot.attributes_for( :licitacao_pessoa_do_projeto )
	}

	let(:atributos_invalidos) {
		{ pessoa_id: nil }
	}

	describe "GET #show" do
		it "atribui a pessoa_do_projeto requisitado(a) à @pessoa_do_projeto" do
			pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
			get :show, params: {id: pessoa_do_projeto.to_param}
			expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
		end
	end

	describe "GET #edit" do
		it "atribui o(a) pessoa_do_projeto requisitado à @pessoa_do_projeto" do
			pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
			get :edit, params: {id: pessoa_do_projeto.to_param}
			expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
		end

		context 'caso projeto seja dispensa' do
			it 'redireciona de volta para o licitante e retorna erro' do
				projeto = FactoryBot.create :licitacao_projeto, :dispensa
				pessoa_do_projeto = FactoryBot.create :licitacao_pessoa_do_projeto, projeto: projeto
				get :edit, params: {id: pessoa_do_projeto.to_param}
				expect(response).to redirect_to(pessoa_do_projeto)
				expect(flash[:alert]).to include "Não é necessário cadastrar proposta"
			end
		end

		context 'caso não seja dispensa' do
			context 'quando os lances ainda não foram abertos' do
				it 'retorna todos os lotes do projeto' do
					pending("Implementar - Nathann")
					fail
				end
			end
			context 'quando os lances foram abertos' do
				it 'retorna todos os lotes que a pessoa do projeto ganhou' do
					pending("Implementar - Nathann")
					fail
				end

				it 'cria itens_do_projeto_por_pessoa com final=true' do
					pending("Implementar - Nathann")
					fail
				end
			end

		end
	end

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{ pessoa_id: Base::Pessoa.find_or_create_by!( FactoryBot.attributes_for(:pessoa_juridica, nome: "Fulano") ).id }
			}

			it "atualiza o(a) pessoa_do_projeto requisitado(a)" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				post :update, params: {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				pessoa_do_projeto.reload
				expect(pessoa_do_projeto.pessoa_id).to eq novos_atributos[:pessoa_id]
			end

			it "atribui o(a) pessoa_do_projeto requisitado(a) à @pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				post :update, params: {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_validos}
				expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
			end

			it "redireciona para o(a) pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				post :update, params: {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_validos}
				expect(response).to redirect_to(pessoa_do_projeto)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui o(a) pessoa_do_projeto à @pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				post :update, params: {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_invalidos}
				expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
			end

			it "re-renderiza o template 'edit'" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				post :update, params: {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_invalidos}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "GET #justificativa_descredenciamento" do
		it "atribui o(a) pessoa_do_projeto requisitado à @pessoa_do_projeto" do
			pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
			get :justificativa_descredenciamento, {id: pessoa_do_projeto.to_param}
			expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
		end
	end

	describe "PATCH #descredenciar" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{ justificativa_descredenciado: 'Justificativa teste' }
			}

			it "atualiza o(a) pessoa_do_projeto requisitado(a)" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :descredenciar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				pessoa_do_projeto.reload
				expect(pessoa_do_projeto.credenciado).to be_falsey
				expect(pessoa_do_projeto.justificativa_descredenciado).to eq novos_atributos[:justificativa_descredenciado]
			end

			it "atribui o(a) pessoa_do_projeto requisitado(a) à @pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :descredenciar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
			end

			it "redireciona para o(a) pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :descredenciar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				expect(response).to redirect_to(licitacao_pessoa_do_projeto_path(pessoa_do_projeto))
			end
		end

		context "com parâmetros inválidos" do
			let(:atributos_invalidos_descredenciamento) {
				{ justificativa_descredenciado: nil }
			}
			it "atribui o(a) pessoa_do_projeto à @pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :descredenciar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_invalidos_descredenciamento}
				expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
			end

			it "re-renderiza o template 'justificativa_descredenciamento'" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :descredenciar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_invalidos_descredenciamento}
				expect(response).to render_template("justificativa_descredenciamento")
			end
		end
	end

	describe "GET #justificativa_desclassificacao" do
		it "atribui o(a) pessoa_do_projeto requisitado à @pessoa_do_projeto" do
			pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
			get :justificativa_desclassificacao, {id: pessoa_do_projeto.to_param}
			expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
		end
	end

	describe "PATCH #desclassificar" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{ justificativa_desclassificado: 'Justificativa teste' }
			}

			it "atualiza o(a) pessoa_do_projeto requisitado(a)" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :desclassificar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				pessoa_do_projeto.reload
				expect(pessoa_do_projeto.classificado).to be_falsey
				expect(pessoa_do_projeto.justificativa_desclassificado).to eq novos_atributos[:justificativa_desclassificado]
			end

			it "atribui o(a) pessoa_do_projeto requisitado(a) à @pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :desclassificar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
			end

			it "redireciona para o(a) pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :desclassificar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: novos_atributos}
				expect(response).to redirect_to(licitacao_pessoa_do_projeto_path(pessoa_do_projeto))
			end
		end

		context "com parâmetros inválidos" do
			let(:atributos_invalidos_desclassificacao) {
				{ justificativa_desclassificado: nil }
			}
			it "atribui o(a) pessoa_do_projeto à @pessoa_do_projeto" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :desclassificar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_invalidos_desclassificacao}
				expect(assigns(:pessoa_do_projeto)).to eq(pessoa_do_projeto)
			end

			it "re-renderiza o template 'justificativa_desclassificacao'" do
				pessoa_do_projeto = Licitacao::PessoaDoProjeto.create! atributos_validos
				patch :desclassificar, {id: pessoa_do_projeto.to_param, licitacao_pessoa_do_projeto: atributos_invalidos_desclassificacao}
				expect(response).to render_template("justificativa_desclassificacao")
			end
		end
	end

	describe "PATCH #anular_lote" do
		let(:lote){
			FactoryBot.create :licitacao_lote , :completo
		}
		context "Anulando lote" do
			it "anulando e redirecionando" do
				pessoa_do_projeto = lote.projeto.pessoas_do_projeto.first
				patch :anular_lote, id: pessoa_do_projeto.to_param, :lote_id => lote.id
				expect(response).to redirect_to(licitacao_pessoa_do_projeto_path(pessoa_do_projeto))
			end
		end
	end

	describe "#verifica_se_esta_credenciado" do
		context "quando tentamos dar propostas" do
			it "se não for credenciado redireciona e mostra mensagem" do
				pessoa_do_projeto = FactoryBot.create :licitacao_pessoa_do_projeto, credenciado: false, justificativa_descredenciado: 'Justificativa teste'
				get :edit, params: {id: pessoa_do_projeto.to_param}
				expect(response).to redirect_to(pessoa_do_projeto)
				expect(flash[:alert]).to include "Licitante deve ser credenciado para abertura de proposta."
			end
		end
	end

end
