require 'rails_helper'

RSpec.describe OrcamentosController, type: :controller do
	sign_in_admin
	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# Orcamento válido.
	let(:atributos_validos) {
		FactoryBot.attributes_for :orcamento_2016
	}

	let(:atributos_validos_2017) {
		FactoryBot.attributes_for :orcamento_2017
	}


	let(:atributos_invalidos) {
		{exercicio: 0}
	}

	describe "GET #index" do
		it "atribui a lista de orcamentos à @orcamentos" do
			orcamento = Orcamento.create! atributos_validos
			get :index
			expect(assigns(:orcamentos)).to eq([orcamento])
		end
	end

	describe "GET #show" do
		before do
			@orcamento = Orcamento.create! atributos_validos
			@request.session[:contexto_id] = @orcamento.id
			@request.session[:contexto_tipo] = @orcamento.class.name
		end

		it "atribui a orcamento requisitado(a) à @orcamento" do
			get :show, params: {exercicio: @orcamento.to_param}
			expect(assigns(:orcamento)).to eq(@orcamento)
		end
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) orcamento à @orcamento" do
			get :new
			expect(assigns(:orcamento)).to be_a_new(Orcamento)
		end
	end

	describe "GET #edit" do
		before do
			@orcamento = Orcamento.create! atributos_validos
			@request.session[:contexto_id] = @orcamento.id
			@request.session[:contexto_tipo] = @orcamento.class.name
		end

		it "atribui o(a) orcamento requisitado à @orcamento" do
			get :edit, params: {exercicio: @orcamento.to_param}
			expect(assigns(:orcamento)).to eq(@orcamento)
		end
	end

	describe "POST #create" do
		context "com parâmetros válidos" do
			it "cria um(a) novo(a) Orcamento" do
				expect {
					post :create, params: {orcamento: atributos_validos}
				}.to change(Orcamento, :count).by(1)
			end

			it "atribui o(a) orcamento recém criado(a) à @orcamento" do
				post :create, params: {orcamento: atributos_validos}
				expect(assigns(:orcamento)).to be_a(Orcamento)
				expect(assigns(:orcamento)).to be_persisted
			end

			it "redireciona para o(a) orcamento criado(a)" do
				post :create, params: {:orcamento => atributos_validos}
				expect(response).to redirect_to(Orcamento.last)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) orcamento recém criado(a), mas não salvo(a), à @orcamento" do
				post :create, params: {orcamento: atributos_invalidos}
				expect(assigns(:orcamento)).to be_a_new(Orcamento)
			end

			it "re-renderiza o template 'new'" do
				post :create, params: {orcamento: atributos_invalidos}
				expect(response).to render_template("new")
			end
		end
	end

	describe "PUT #update" do
		context "com parâmetros válidos" do
			before do
				@orcamento = Orcamento.create! atributos_validos
				@request.session[:contexto_id] = @orcamento.id
				@request.session[:contexto_tipo] = @orcamento.class.name
			end

			let(:novos_atributos) {
				{ numero_da_lei: 'nova data' }
			}

			it "atualiza o(a) orcamento requisitado(a)" do
				post :update, params: {exercicio: @orcamento.to_param, orcamento: novos_atributos}
				@orcamento.reload
				expect( @orcamento.numero_da_lei ).to eq 'nova data'
			end

			it "atribui o(a) orcamento requisitado(a) à @orcamento" do
				post :update, params: {exercicio: @orcamento.to_param, orcamento: atributos_validos}
				expect(assigns(:orcamento)).to eq(@orcamento)
			end

			it "redireciona para o(a) orcamento" do
				post :update, params: {exercicio: @orcamento.to_param, orcamento: atributos_validos}
				expect(response).to redirect_to(@orcamento)
			end
		end

		context "com parâmetros inválidos" do
			before do
				@orcamento = Orcamento.create! atributos_validos
				@request.session[:contexto_id] = @orcamento.id
				@request.session[:contexto_tipo] = @orcamento.class.name
			end

			it "atribui o(a) orcamento à @orcamento" do
				post :update, params: {exercicio: @orcamento.to_param, orcamento: atributos_invalidos}
				expect(assigns(:orcamento)).to eq(@orcamento)
			end

			it "re-renderiza o template 'edit'" do
				post :update, params: {exercicio: @orcamento.to_param, orcamento: atributos_invalidos}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "DELETE #destroy" do
		before do
			@orcamento = Orcamento.create! atributos_validos
			@request.session[:contexto_id] = @orcamento.id
			@request.session[:contexto_tipo] = @orcamento.class.name
		end

		it "destrói o(a) orcamento requisitado(a)" do
			expect {
				delete :destroy, params: { exercicio: @orcamento.to_param, :senha_administrador => '123123123'}
			}.to change(Orcamento, :count).by(-1)
		end

		it "deletar orçamento com a senha de adm" do
			delete :destroy, params: {:exercicio => @orcamento.to_param, :senha_administrador => '123123123'}
			expect(response).to redirect_to(orcamentos_path)
		end

		it "tentar deletar orçamento com a senha errada" do
			skip "a funcionalidade de confirmar a senha antes de deletar orçamento foi temporariamente desabilitada"
			delete :destroy, params: {:exercicio => @orcamento.to_param, :senha_administrador => '123'}
			expect(response).to redirect_to(@orcamento)
		end

		it "coloca nil no orcamento_id caso seja o escolhido" do
			delete :destroy, params: {:exercicio => @orcamento.to_param, :senha_administrador => '123123123'}
			expect(session[:contexto_id]).to eq(nil)
		end
	end

	describe 'GET #configuracoes_eventos_contabeis' do
		it 'renderiza a view de configuração dos eventos contábeis' do
			orcamento = FactoryBot.create :orcamento_2017
			get :configuracoes_eventos_contabeis, { exercicio: orcamento.exercicio }

			expect(response).to render_template(:configuracoes_eventos_contabeis)
		end

		it 'associa as ações do sistema à @acoes_do_sistema' do
			acao_do_sistema = FactoryBot.create :acao_do_sistema
			orcamento = FactoryBot.create :orcamento_2017
			get :configuracoes_eventos_contabeis, { exercicio: orcamento.exercicio }

			expect(assigns(:acoes_do_sistema)).to include acao_do_sistema
		end
	end

	describe 'PUT #configuracoes_eventos_contabeis_update' do
		before do
			@orcamento = Orcamento.create! atributos_validos
			@request.session[:contexto_id] = @orcamento.id
			@request.session[:contexto_tipo] = @orcamento.class.name
		end

		context 'quando são passados os eventos para serem definidos como padrões' do
			it 'define o evento da determinada ação como padrão true e todos os outros como false' do
				evento_contabil = FactoryBot.create :evento_contabil, :empenhar, orcamento_id: @orcamento.id
				put :configuracoes_eventos_contabeis_update, {
					exercicio: @orcamento.exercicio,
					eventos_contabeis: { '1'=> evento_contabil.id }
				}
				evento_contabil.reload

				expect(evento_contabil.padrao).to be_truthy
			end
		end

		context 'quando não são passados os eventos para serem definidos como padrões' do
			it 'define todos os eventos da determinada ação como padrão false' do
				evento_contabil = FactoryBot.create :evento_contabil, :empenhar, orcamento_id: @orcamento.id
				put :configuracoes_eventos_contabeis_update, {
					exercicio: @orcamento.exercicio,
					eventos_contabeis: { '1'=> '' }
				}
				evento_contabil.reload

				expect(evento_contabil.padrao).to be_falsey
			end
		end
	end

	describe 'PUT #finalizar' do
		before do
			@orcamento = Orcamento.create! atributos_validos_2017
			@request.session[:contexto_id] = @orcamento.id
			@request.session[:contexto_tipo] = @orcamento.class.name
		end

		let(:atributos_finalizacao) {
			{ data_da_legislacao: Date.current, legislacao: "12123" }
		}

		context 'quando o LOA está consistente' do
			# cria_tipos_de_despesa
			# before(:each) do
			# 		@ppa = Ppa::Ppa.last
			# 		# Criando coisas necessárias para a finalização
			# 		FactoryBot.create :ppa_iniciativa_para_ensino_fundamental
			# 		FactoryBot.create :indicador_escolas_construidas, :ppa_atual
			# 		FactoryBot.create :ppa_quantitativo
			# end

			it "redireciona para o LOA atual" do
				skip
				# put :finalizar_ppa, {id: @ppa.id, ppa_ppa: atributos_finalizacao}
				# expect(response).to redirect_to(@ppa)
			end

			it 'atualiza os valores' do
				skip
				# put :finalizar_ppa, {id: @ppa.id, ppa_ppa: atributos_finalizacao}
				# @ppa.reload
				# expect(@ppa.legislacao).to eq "12123"
			end

			it "mostra mensagem de sucesso para o usuário" do
				skip
				# put :finalizar_ppa, {id: @ppa.id, ppa_ppa: atributos_finalizacao}
				# expect(controller).to set_flash[:notice].to('Plano Plurianual finalizado com sucesso.')
			end

			context 'mas a data de legislacao está em branco' do
				it "redireciona para o LOA atual" do
					skip
					# ppa = Ppa::Ppa.last
					# put :finalizar_ppa, {id: ppa.id, ppa_ppa: {legislacao: "12123"}}
					# expect(response).to redirect_to(ppa)
				end

				it 'nem atualiza os valores' do
					skip
					# put :finalizar_ppa, {id: @ppa.id, ppa_ppa: {legislacao: "12123"}}
					# @ppa.reload
					# expect(@ppa.legislacao).to be_nil
				end

				it "mostra mensagem de erro para o usuário" do
					skip
					# ppa = Ppa::Ppa.last
					# put :finalizar_ppa, {id: ppa.id, ppa_ppa: {legislacao: "12123"}}
					# expect(controller).to set_flash[:alert].to('Data da Legislação é obrigatória.')
				end
			end
			context 'mas a legislacao está em branco' do
				it "redireciona para o LOA atual" do
					skip
					# ppa = Ppa::Ppa.last
					# put :finalizar_ppa, {id: ppa.id, ppa_ppa: {data_da_legislacao: Date.current}}
					# expect(response).to redirect_to(ppa)
				end

				it 'nem atualiza os valores' do
					skip
					# put :finalizar_ppa, {id: @ppa.id, ppa_ppa: {data_da_legislacao: Date.current}}
					# @ppa.reload
					# expect(@ppa.legislacao).to be_nil
				end

				it "mostra mensagem de erro para o usuário" do
					skip
					# ppa = Ppa::Ppa.last
					# put :finalizar_ppa, {id: ppa.id, ppa_ppa: {data_da_legislacao: Date.current}}
					# expect(controller).to set_flash[:alert].to('Legislação é obrigatória.')
				end
			end
		end
	end
end
