class Ppa::PpasController < ApplicationController
	include ControllerConcern
	include PpaControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: :download_contexto
	before_action :set_ppa_ppa, only: [
		:show, :edit, :update,:download_contexto,
		:configuracoes, :configura_detalhamento_de_despesas_nas_iniciativas,
		:libera_votacao, :libera_propostas, :bloqueia_votacao, :bloqueia_propostas,
		:ativa_ppa_participativo, :desativa_ppa_participativo
	]
	before_action :disponibiliza_dependencias, only: [:new, :edit]

	# GET /ppa/ppas
	def index
		@q = Ppa::Ppa.order(:exercicio_inicial).search(params[:q])
		@ppa_ppas = @q.result.reverse_order.paginate(page: params[:page], per_page: 10)
	end

	# GET /ppa/ppas/1
	def show
		if @ppa_ppa.url_arquivo_de_contexto.blank?
			@target = '_self'
		else
			@target = '_blank'
		end

		if params[:ppa_participativo].present?
			@mensagem_confirmacao_abertura_propostas = "Deseja realmente ativar o período de propostas imediatamente?"
			@mensagem_confirmacao_abertura_propostas << " A data de início definida nas configurações será alterada para o dia de hoje." if @ppa_ppa.abertura_do_periodo_de_propostas

			@mensagem_confirmacao_abertura_votacao = "Deseja realmente ativar o período de votação imediatamente?"
			@mensagem_confirmacao_abertura_votacao << " A data de início definida nas configurações será alterada para o dia de hoje." if @ppa_ppa.abertura_do_periodo_de_votacao

			@mensagem_confirmacao_fim_propostas = "Deseja realmente finalizar o período de propostas imediatamente?"
			@mensagem_confirmacao_fim_propostas << " A data de término definida nas configurações será alterada para o dia de hoje. " if @ppa_ppa.fim_do_periodo_de_propostas

			@mensagem_confirmacao_fim_votacao = "Deseja realmente finalizar o período de votação imediatamente?"
			@mensagem_confirmacao_fim_votacao << " A data de término definida nas configurações será alterada para o dia de hoje. " if @ppa_ppa.fim_do_periodo_de_votacao
			render "ppa/ppas/ppa_participativo/show_ppa_participativo"
		else
			@dados_obrigatorios_invalidos = get_dados_obrigatorios_do_ppa_invalidos
			@dados_opcionais_invalidos = get_dados_opcionais_do_ppa_invalidos
		end
	end

	# GET /ppa/ppas/new
	def new
		@ppa_ppa = Ppa::Ppa.new
	end

	# GET /ppa/ppas/1/edit
	def edit
		if params[:ppa_participativo].present?
			render "ppa/ppas/ppa_participativo/form_ppa_participativo"
		end
	end

	# POST /ppa/ppas
	def create
		@ppa_ppa = Ppa::Ppa.new(ppa_ppa_params)

		if @ppa_ppa.save
			session[:contexto_id] = @ppa_ppa.id
			session[:contexto_tipo] = @ppa_ppa.class.name

			redirect_to configuracoes_ppa_ppa_path( @ppa_ppa ), notice: 'Plano Plurianual foi criado com sucesso.'
		else
			disponibiliza_dependencias
			render :new
		end
	end

	# PATCH/PUT /ppa/ppas/1
	def update
		if params[:remover_capa_de_apresetacao_do_ppa_participativo]
			@ppa_ppa.capa_de_apresentacao_ppa_participativo.destroy
			@ppa_ppa.capa_de_apresentacao_ppa_participativo.clear
		end
		if  params[:liberar_temos_de_uso] == "true"
			@ppa_ppa.habilitar_termos_de_uso = true
			@ppa_ppa.mostra_os_temos_apos_edicao
		end

		if @ppa_ppa.update(ppa_ppa_params)
			redirect_path = params[:ppa_participativo] ? ppa_ppa_path(@ppa_ppa, ppa_participativo: true) : ppa_ppa_path(@ppa_ppa)
			redirect_to redirect_path, notice: 'Atualizado com sucesso.'
		else
			disponibiliza_dependencias

			render params[:ppa_participativo] ? "ppa/ppas/ppa_participativo/form_ppa_participativo" : :edit
		end
	end

	# DELETE /ppa/ppas/1
	def destroy
		if verifica_administrador
			if current_usuario.valid_password?params[:senha_administrador]
				ActiveRecord::Base.transaction do
					ppa_atual.eixos.each do |eixo|
						eixo.delete
					end
					ppa_atual.url_arquivo_de_contexto.clear

					mensagem = apaga_e_retorna_mensagem(ppa_atual)

					if mensagem[:alert].present?
						redirect_to ppa_atual, mensagem
						raise ActiveRecord::Rollback
					else
						session[:contexto_id] = nil
						session[:contexto_tipo] = nil
						redirect_to ppa_ppas_path, mensagem
					end
				end
			else
				redirect_to ppa_atual, notice:'Senha invalida'
			end
		else
			redirect_to ppa_atual, notice:'Você não é administrador desse sistema'
		end
	end


	def download_contexto
		if @ppa_ppa.url_arquivo_de_contexto_file_name.nil?
			redirect_to @ppa_ppa, notice: 'Esse PPA não possui um arquivo de contexto'
		else
			redirect_to @ppa_ppa.url_arquivo_de_contexto.url
		end
	end

	def configuracoes
		@configuracoes = @ppa_ppa.configuracoes
	end

	def configura_detalhamento_de_despesas_nas_iniciativas
		if @ppa_ppa.detalhar_despesas_nas_iniciativas!
			redirect_to configuracoes_ppa_ppa_path, notice: 'Detalhamento de despesas nas iniciativas configurado com sucesso'
		else
			redirect_to configuracoes_ppa_ppa_path, alert: 'Ops! Esse PPA já tem iniciativas cadastradas'
		end
	end

	def ativa_ppa_participativo
		ppa_participativo_ja_ativo = Ppa::Ppa.where("ppa_participativo_ativo is true and id <> ?", @ppa_ppa.id).first
		if ppa_participativo_ja_ativo.present?
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: "O PPA Participativo Online #{ppa_participativo_ja_ativo.intervalo} já está ativo, primeiro desative para poder ativar outro."
		else
			if @ppa_ppa.update(ppa_participativo_ativo: true)
				redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), notice: 'PPA Participativo Online ativado com sucesso, visite a página.'
			else
				redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: 'Não foi possível ativar o PPA Participativo Online.'
			end
		end
	end

	def desativa_ppa_participativo
		if @ppa_ppa.update(libera_votacao: false, libera_propostas: false, ppa_participativo_ativo: false )
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), notice: 'PPA Participativo Online desativado com sucesso.'
		else
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: 'Não foi possível desativar o PPA Participativo Online.'
		end
	end

	def libera_votacao
		@ppa_ppa = Ppa::Ppa.find(params[:id])
		if @ppa_ppa.ppa_participativo_ativo
			message = @ppa_ppa.abrir_votacao
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), notice: message
		else
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: 'PPA Participativo Online não está ativado. ative-o, para depois liberar o período de envio das propostas.'
		end
	end

	def bloqueia_votacao
		@ppa_ppa = Ppa::Ppa.find(params[:id])
		if @ppa_ppa.ppa_participativo_ativo
			message = @ppa_ppa.fechar_votacao
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), notice: message
		else
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: 'PPA Participativo Online não está ativado.'
		end
	end

	def libera_propostas
		@ppa_ppa = Ppa::Ppa.find(params[:id])
		if @ppa_ppa.ppa_participativo_ativo
			message = @ppa_ppa.abrir_propostas
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), notice: message
		else
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: 'PPA Participativo Online não está ativado, ative-o, para depois liberar o período de envio das propostas.'
		end
	end

	def bloqueia_propostas
		@ppa_ppa = Ppa::Ppa.find(params[:id])
		if @ppa_ppa.ppa_participativo_ativo
			message = @ppa_ppa.fechar_propostas
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), notice: message
		else
			redirect_to ppa_ppa_path(@ppa_ppa, ppa_participativo: true), alert: 'PPA Participativo Online não está ativado.'
		end
	end

	def finalizar_ppa
		finalizacao_params = ppa_finalizacao_params.merge(status: 2)
		if get_dados_obrigatorios_do_ppa_invalidos.present?
			redirect_to ppa_atual, alert: 'Existem inconsistências que impedem o PPA de ser fechado'
		elsif ppa_finalizacao_params[:data_da_legislacao].blank?
			redirect_to ppa_atual, alert: 'Data da Legislação é obrigatória.'
		elsif ppa_finalizacao_params[:legislacao].blank?
			redirect_to ppa_atual, alert: 'Legislação é obrigatória.'
		elsif ppa_atual.update(finalizacao_params)
			redirect_to ppa_atual, notice: 'Plano Plurianual finalizado com sucesso.'
		else
			redirect_to ppa_atual, alert: 'Falha ao finalizar o Plano Plurianual.'
		end
	end

	def enviar_para_votacao
		if get_dados_obrigatorios_do_ppa_invalidos.present?
			redirect_to ppa_atual, alert: 'Existem inconsistências que impedem o PPA de ser fechado'
		elsif enviar_para_votacao_params[:data_de_envio].blank?
			redirect_to ppa_atual, alert: 'Data da Envio é obrigatório.'
		elsif ppa_atual.em_votacao? || ppa_atual.aprovado?
			redirect_to ppa_atual, alert: 'PPA não está aberto'
		else
			ppa_atual.data_de_envio = enviar_para_votacao_params[:data_de_envio]
			ppa_atual.status = :em_votacao
			if ppa_atual.save(validate: false)
				redirect_to ppa_atual, notice: 'Plano Plurianual enviado para votação.'
			else
				redirect_to ppa_atual, alert: 'Falha ao enviar o Plano Plurianual para votação.'
			end
		end
	end

	private

	def set_ppa_ppa
		@ppa_ppa = Ppa::Ppa.find(params[:id])
	end

	def disponibiliza_dependencias
		@projecoes = Projecao::ProjecaoDeReceita.all
	end

	def ppa_ppa_params
		params.require(:ppa_ppa).permit(:financiamento_do_plano,
			:abertura_do_periodo_de_propostas, :fim_do_periodo_de_propostas, :abertura_do_periodo_de_votacao, :fim_do_periodo_de_votacao, :capa_de_apresentacao_ppa_participativo,
			:projecao_de_receita_id, :quantidade_de_caracteres_das_propostas, :ativar_somente_micro_regiao, :ativar_somente_area_tematica,:habilitar_termos_de_uso,
			:exercicio_inicial, :exercicio_final, :prefeito, :vice_prefeito, :url_arquivo_de_contexto, :pagina_principal,:termos_de_uso,
			:libera_problemas, :quantidade_limite_de_propostas, :ppa_participativo_ativo, :chamada_para_votacao_de_propostas, :chamada_para_envio_de_propostas
		)
	end

	def ppa_finalizacao_params
		params.require(:ppa_ppa).permit(:legislacao, :data_da_legislacao, :status)
	end

	def enviar_para_votacao_params
		params.require(:ppa_ppa).permit(:data_de_envio)
	end
end
