# app/controllers/concerns/expections_errors.rb
module PpaControllersConcern
	extend ActiveSupport::Concern

	include ContabilidadeConcern

	included do
		unless controller_name == "ppas"
			before_action :verifica_se_tem_ppa_na_sessao!
		end
	end

	def verifica_se_tem_ppa_na_sessao!
		unless request.path_parameters[:format] == 'json'
			redirect_to contexto_path(tab: 'ppa'), alert: 'Primeiro selecione um PPA no contexto.' if ppa_atual.blank?
		end
	end

	def get_dados_obrigatorios_do_ppa_invalidos
		dados_invalidos = get_logs_de_convenios_invalidos
		dados_invalidos += get_logs_de_programas_invalidos
		dados_invalidos += get_logs_de_orgaos_invalidos
		dados_invalidos += get_logs_de_receita_e_despesa
		return dados_invalidos
	end

	def get_logs_de_convenios_invalidos
		dados_invalidos = []
		ppa_atual.convenios.each do |convenio|
			dados_invalidos.push("Convênio <a href=\"#{ppa_convenio_path(convenio)}\">#{convenio.id}</a> não está com o valor distribuído corretamente entre os exercicios. Para distribuir clique <a href=\"#{ppa_valores_do_convenio_edit_path(convenio)}\">aqui</a>") unless convenio.valido?
		end
		return dados_invalidos
	end

	def get_dados_opcionais_do_ppa_invalidos
		dados_invalidos = get_logs_de_configuracoes_invalidas
		return dados_invalidos
	end

	private
	def get_logs_de_configuracoes_invalidas
		configuracao = Configuracao.first
		dados_invalidos = []
		unless configuracao.existe_imagem?
			dados_invalidos.push("Logo da prefeitura não está cadastrada no sistema. Para cadastrar clique <a href=\"#{edit_configuracoes_path}\">aqui</a>")
		end

		unless configuracao[:nome_da_prefeitura].present?
			dados_invalidos.push("Nome da prefeitura não está cadastrada no sistema. Para cadastrar clique <a href=\"#{edit_configuracoes_path}\">aqui</a>")
		end

		unless ppa_atual.tem_contexto?
			dados_invalidos.push("Contexto para relatório de PPA não está anexado no sistema. Para anexar clique <a href=\"#{edit_ppa_ppa_path(ppa_atual)}\">aqui</a>")
		end

		if ppa_atual.tecnicos.count == 0
			dados_invalidos.push("Equipe técnica não foi cadastrada no sistema. Para cadastrar clique <a href=\"#{base_tecnicos_path}\">aqui</a>")
		end
		return dados_invalidos
	end

	def get_logs_de_programas_invalidos
		dados_invalidos = []

		if ppa_atual.programas.count.zero?
			dados_invalidos.push("Não há Programas cadastrados no PPA. Para cadastrar clique <a href=\"#{ppa_programas_path}\">aqui</a>")
		end

		ppa_atual.programas.each do |programa|
			dados_invalidos.push("Programa <a href=\"#{ppa_programa_path(programa)}\">#{programa.codigo_completo}</a> não está orçado.") unless programa.projecoes_de_despesa_resumidas['total-geral'] > 0
		end

		ppa_atual.programas_invalidos.each do |programa|
			if programa['programa_id'].present?
				if programa['indicador_id'].blank? and programa['tipo_de_programa'] == "1"
					log_de_indicadores =("Programa <a href=\"#{ppa_programa_path(id: programa['programa_id'])}\">#{programa['programa_codigo']}</a> não possui indicadores")
					unless dados_invalidos.include?(log_de_indicadores)
						dados_invalidos.push(log_de_indicadores)
					end
				end

				if programa['objetivo_id'].present?
					if programa['iniciativa_id'].blank?
						log_de_iniciativas =("Objetivo <a href=\" #{ppa_objetivo_path(id: programa['objetivo_id'])}\">#{programa['objetivo_codigo'].to_s.rjust(3, '0')}</a> do programa <a href=\"#{ppa_programa_path(id: programa['programa_id'])}\">#{programa['programa_codigo']}</a> não possui iniciativas")
						unless dados_invalidos.include?(log_de_iniciativas)
							dados_invalidos.push(log_de_iniciativas)
						end
					end

					if programa['meta_id'].blank? and programa['tipo_de_programa'] == "1"
						log_de_metas = ("Objetivo <a href=\" #{ppa_objetivo_path(id: programa['objetivo_id'])}\">#{programa['objetivo_codigo'].to_s.rjust(3, '0')}</a> do programa <a href=\"#{ppa_programa_path(id: programa['programa_id'])}\">#{programa['programa_codigo']}</a> não possui metas")
						unless dados_invalidos.include?(log_de_metas)
							dados_invalidos.push(log_de_metas)
						end
					end
				else
					dados_invalidos.push("Programa <a href=\"#{ppa_programa_path(id: programa['programa_id'])}\">#{programa['programa_codigo']}</a> não possui objetivos cadastrados")
				end
			else
				dados_invalidos.push("O Ppa não possui programas cadastrados")
			end
		end
		return dados_invalidos
	end


	def get_logs_de_orgaos_invalidos
		dados_invalidos = []

		if ppa_atual.orgaos.count == 0
			dados_invalidos.push("O Ppa não possui orgãos cadastrados")
		end

		ppa_atual.orgaos.each do |orgao|
			if orgao.unidades_orcamentarias.count == 0
				dados_invalidos.push("Orgão <a href=\"#{ppa_orgao_path(orgao)}\">#{orgao.codigo_com_zeros}</a> não possui unidades orçamentárias cadastradas")
			end
		end

		return dados_invalidos
	end

	def get_logs_de_receita_e_despesa
		dados_invalidos = []

		if ppa_atual.projecao_de_receita.present?
			ppa_atual.projecao_de_receita.exercicios_com_tipo.each do |exercicio_com_tipo|
				tipo = exercicio_com_tipo[:tipo]
				if tipo != 'orcado'
					exercicio = exercicio_com_tipo[:exercicio]
					if ppa_atual.projecao_de_receita.present?
						total_receita = ppa_atual.projecao_de_receita.total_das_receitas_por_exercicio_e_tipo exercicio_com_tipo[:exercicio], tipo
					else
						total_receita = 0
					end

					total_despesa = ppa_atual.valor_total_da_despesa_por_exercicio exercicio

					if (total_receita > 0) && (total_receita.to_f < total_despesa.to_f)
						dados_invalidos.push("No exercício <b>#{exercicio}</b>, o total das receitas é menor que o total das despesas. Total da receita: <b>#{total_receita.real_contabil}</b> e da despesa: <b>#{total_despesa.real_contabil}</b>")
					end
				end
			end
		end

		return dados_invalidos
	end

end
