require 'rails_helper'

RSpec.describe Ppa::PropostasController, type: :controller do
	sign_in_admin
	set_ppa_id_na_sessao

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

	let(:atributos_validos_problema) {
		FactoryBot.attributes_for(:ppa_proposta, is_problema: true, problema:"Problema para teste no sistema" )
	}

	let(:atributos_invalidos_problema) {
		{ problema: '', is_problema: true }
	}

	let(:atributos_invalidos) {
		{ descricao: '' }
	}

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


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

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

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

	describe "GET #update_status" do
		it "atualiza o status da proposta para rejeitada" do
			request.env['HTTP_REFERER'] = root_url
			proposta = Ppa::Proposta.create! atributos_validos
			get :update_status, {id: proposta.to_param, ppa_proposta: proposta, status: 'rejeitada'}
			proposta.reload
			expect( proposta.status ).to eq 'rejeitada'
		end

		it "atualiza o status da proposta para em votacao" do
			request.env['HTTP_REFERER'] = root_url
			proposta = Ppa::Proposta.create! atributos_validos
			get :update_status, {id: proposta.to_param, ppa_proposta: proposta, status: 'em_votacao'}
			proposta.reload
			expect( proposta.status ).to eq 'em_votacao'
		end

		it "atualiza o status da proposta para aprovada" do
			request.env['HTTP_REFERER'] = root_url
			proposta = Ppa::Proposta.create! atributos_validos
			get :update_status, {id: proposta.to_param, ppa_proposta: proposta, status: 'aprovada'}
			proposta.reload
			expect( proposta.status ).to eq 'aprovada'
		end

		it "não salva alteração quando o status é inválido" do
			request.env['HTTP_REFERER'] = root_url
			proposta = Ppa::Proposta.create! atributos_validos
			get :update_status, {id: proposta.to_param, ppa_proposta: proposta, status: 'status_invalido'}
			proposta.reload
			expect(response).to redirect_to(:back)
			expect(flash[:alert]).to eq('Ocorreu um erro na atualização de status')
		end
	end

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

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

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

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

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

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				{ descricao: 'Nova descrição...',
					area_tematica_id:
						Ppa::AreaTematica.find_by(nome: 'Educação') ||
						FactoryBot.create(:area_tematica_educacao, :ppa_2014).id,
					regiao_id:
						Ppa::Regiao.find_by(nome: 'Sede do Município').try(:id) ||
						FactoryBot.create(:regiao_sede_do_municipio, :ppa_2014).id,
					cidadao_id: nil,
					interna: true
				}
			}

			it "atualiza o(a) proposta requisitado(a)" do
				proposta = Ppa::Proposta.create! atributos_validos
				post :update, params: {id: proposta.to_param, ppa_proposta: novos_atributos}
				proposta.reload
				expect( proposta.descricao ).to eq "Nova descrição..."
			end

			it "redireciona para o grid" do
				proposta = Ppa::Proposta.create! atributos_validos
				post :update, params: {id: proposta.to_param, ppa_proposta: atributos_validos}
				expect(response).to redirect_to(proposta)
			end
		end

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

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

	describe "DELETE #destroy" do
		it "destrói o(a) proposta requisitado(a)" do
			proposta = Ppa::Proposta.create! atributos_validos
			expect {
				delete :destroy, params: {:id => proposta.to_param}
			}.to change(Ppa::Proposta, :count).by(-1)
		end

		it "redireciona para a lista de propostas" do
			proposta = Ppa::Proposta.create! atributos_validos
			delete :destroy, params: {:id => proposta.to_param}
			expect(response).to redirect_to(ppa_propostas_path)
		end
	end

	describe "GET #imprimir" do
		it "retorna status 200 OK" do
			ppa = Ppa::Ppa.find_or_create_by!( FactoryBot.attributes_for( :ppa_fortaleza_2014 ) )

			xhr :get, 'imprimir', {exercicio: ppa.exercicio_inicial }
			expect(response).to have_http_status(:ok)
		end
	end

	describe "PUT #update problemas" do
		context "com parâmetros válidos" do
			it "update um problema com sucesso" do
				proposta = Ppa::Proposta.create! atributos_validos_problema
				post :update, params: {id: proposta.to_param, ppa_proposta: atributos_validos_problema, problema: "Problema teste novo problema"}
				expect(response).to redirect_to(proposta)
			end

			it "update um problema com erro" do
				proposta = Ppa::Proposta.create! atributos_validos_problema
				post :update, params: {id: proposta.to_param, ppa_proposta: atributos_invalidos_problema, problema: "bla"}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "PUT #create problemas" do
		context "com parâmetros válidos" do
			it "criar um problema valido" do
				post :create, params: {ppa_proposta: atributos_validos_problema}
				expect(response).to redirect_to(Ppa::Proposta.last)
			end
			it "criar um problema invalido" do
				Ppa::Proposta.create! atributos_validos_problema
				post :create, params: {ppa_proposta: atributos_invalidos_problema}
				expect(response).to render_template("new")
			end
		end
	end
end
