module DadosGraficosConcern extend ActiveSupport::Concern
	include GraficosConcern

	def dados_para_graficos lista_de_graficos
		@graficos = lista_de_graficos.map do |nome_do_grafico|
				send(nome_do_grafico) if respond_to? nome_do_grafico
		end
		@graficos.compact!

		@graficos
	end

	def grafico_recurso_por_programas_tematicos
		quantidade_recurso_por_programas_tematicos = Ppa::ProjecaoDeDespesa.recurso_por_programas_tematicos(ppa_atual.id)
		total_de_recurso_por_programa_tematico = 0
		if quantidade_recurso_por_programas_tematicos.present?
			img_quantidade_recurso_por_programas_tematicos = grafico_pizza('Recursos por Programas Finalísticos', quantidade_recurso_por_programas_tematicos)
			quantidade_recurso_por_programas_tematicos.map! { |programa|
				total_de_recurso_por_programa_tematico += programa[:quantidade]
				{
					nome: programa[:nome],
					quantidade: programa[:quantidade].real_contabil
				}
			}

			cabecalho = {
				nome: 'Programa',
				tamanho: 120 ,
				alinhamento: 'esquerda'
			},{
				nome: 'Valor',
				tamanho: 60,
				alinhamento: 'direita'
			}
			{
				grafico: img_quantidade_recurso_por_programas_tematicos,
				tabela_dados: quantidade_recurso_por_programas_tematicos.push({nome: 'TOTAL', total: total_de_recurso_por_programa_tematico.real_contabil, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: "Recursos por Programas Finalísticos"
			}
		end
	end

	def grafico_quantidade_proposta_por_area_tematica
		quantidade_de_proposta_por_area_tematica = Ppa::Proposta.quantidade_proposta_por_area_tematica(ppa_atual.id)
		total_de_proposta_por_area_tematica = 0
		if quantidade_de_proposta_por_area_tematica.present?
			img_quantidade_proposta_por_area_tematica = grafico_pizza('Propostas por Área Temática', quantidade_de_proposta_por_area_tematica)
			quantidade_de_proposta_por_area_tematica.map! { |area_tematica|
				total_de_proposta_por_area_tematica += area_tematica[:quantidade]
				{
					nome: area_tematica[:nome],
					quantidade: area_tematica[:quantidade]
				}
			}
			cabecalho = {
				nome: 'Área Temática',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Quantidade',
				tamanho: 60,
				alinhamento: 'direita'
			}

			{
				grafico: img_quantidade_proposta_por_area_tematica,
				tabela_dados: quantidade_de_proposta_por_area_tematica.push({nome: 'TOTAL', total: total_de_proposta_por_area_tematica, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: "Propostas por Área Temática"
			}
		end
	end

	def grafico_quantidade_problema_por_area_tematica
		quantidade_problema_por_area_tematica = Ppa::Proposta.quantidade_problema_por_area_tematica(ppa_atual.id)
		total_de_problema_por_area_tematica = 0
		if quantidade_problema_por_area_tematica.present?
			img_quantidade_proposta_por_area_tematica_com_problema = grafico_pizza('Problemas por Área Temática', quantidade_problema_por_area_tematica)
				quantidade_problema_por_area_tematica.map! { |problema_por_area_tematica|
					total_de_problema_por_area_tematica += problema_por_area_tematica[:quantidade]
					{
						nome: problema_por_area_tematica[:nome],
						quantidade: problema_por_area_tematica[:quantidade]
					}
				}
				cabecalho = {
				nome: 'Área Temática',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Quantidade',
				tamanho: 60,
				alinhamento: 'direita'
			}

			{
				grafico: img_quantidade_proposta_por_area_tematica_com_problema,
				tabela_dados: quantidade_problema_por_area_tematica.push({nome: 'TOTAL', total: total_de_problema_por_area_tematica, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Problemas por Área Temática'
			}
		end
	end

	def grafico_quantidade_problema_por_regiao
		quantidade_de_problemas_por_regiao = Ppa::Proposta.quantidade_problema_por_regiao(ppa_atual.id)
		total_problema_por_regiao = 0
		if quantidade_de_problemas_por_regiao.present?
			img_quantidade_problemas_por_regiao = grafico_pizza('Problema por Região', quantidade_de_problemas_por_regiao)
			quantidade_de_problemas_por_regiao.map! { |problema_por_regiao|
				total_problema_por_regiao += problema_por_regiao[:quantidade]
				{
					nome: problema_por_regiao[:nome],
					quantidade: problema_por_regiao[:quantidade]
				}
			}
			cabecalho = {
				nome: 'Região',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Quantidade',
				tamanho: 60,
				alinhamento: 'direita'
			}

			{
				grafico: img_quantidade_problemas_por_regiao,
				tabela_dados: quantidade_de_problemas_por_regiao.push({nome: 'TOTAL', total: total_problema_por_regiao, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Problema por Região'
			}
		end
	end

	def grafico_quantidade_proposta_por_regiao
		quantidade_de_propostas_por_regiao = Ppa::Proposta.quantidade_proposta_por_regiao(ppa_atual.id)
		total_propostas_por_regiao = 0
		if quantidade_de_propostas_por_regiao.present?
			img_quantidade_proposta_por_regiao = grafico_pizza('Proposta por Região', quantidade_de_propostas_por_regiao)
			quantidade_de_propostas_por_regiao.map! {|proposta_por_regiao|
				total_propostas_por_regiao += proposta_por_regiao[:quantidade]
				{
					nome: proposta_por_regiao[:nome],
					quantidade: proposta_por_regiao[:quantidade]
				}
			}
			cabecalho = {
				nome: 'Região',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Quantidade',
				tamanho: 60,
				alinhamento: 'direita'
			}

			{
				grafico: img_quantidade_proposta_por_regiao,
				tabela_dados: quantidade_de_propostas_por_regiao.push({nome: 'TOTAL', total: total_propostas_por_regiao, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Proposta por Região'
			}
		end
	end

	def grafico_quantidade_problema_por_micro_regiao
		quantidade_de_problemas_por_micro_regiao = Ppa::Proposta.quantidade_problema_por_micro_regiao(ppa_atual.id)
		total_de_problema_por_microrregiao = 0
		if quantidade_de_problemas_por_micro_regiao.present?
			imagem_problemas_por_microrregiao = grafico_barra('Problema por Microrregião', quantidade_de_problemas_por_micro_regiao)
			quantidade_de_problemas_por_micro_regiao.map! {|problema_microrregiao|
				total_de_problema_por_microrregiao += problema_microrregiao[:quantidade]
				{
					nome: problema_microrregiao[:nome],
					quantidade: problema_microrregiao[:quantidade]
				}
			}
			cabecalho = {
				nome: 'Microrregião',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Quantidade',
				tamanho: 60,
				alinhamento: 'direita'
			}

			{
				grafico: imagem_problemas_por_microrregiao,
				tabela_dados: quantidade_de_problemas_por_micro_regiao.push({nome: 'TOTAL', total: total_de_problema_por_microrregiao, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Problema por Microrregião'
			}
		end
	end

	def grafico_quantidade_proposta_por_micro_regiao
		quantidade_de_propostas_por_micro_regiao = Ppa::Proposta.quantidade_proposta_por_micro_regiao(ppa_atual.id)
		if quantidade_de_propostas_por_micro_regiao.present?
			imagem_propostas_por_microrregiao = grafico_barra('Proposta por Microrregião', quantidade_de_propostas_por_micro_regiao)
			total_propostas_por_microrregiao = 0

			quantidade_de_propostas_por_micro_regiao.map { |microrregiao|
				total_propostas_por_microrregiao += microrregiao[:quantidade]
				{
					nome: microrregiao[:nome],
					quantidade: microrregiao[:quantidade]
				}
			}
			cabecalho = {
				nome: 'Microrregião',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Quantidade',
				tamanho: 60,
				alinhamento: 'direita'
			}
			{
				grafico: imagem_propostas_por_microrregiao,
				tabela_dados: quantidade_de_propostas_por_micro_regiao.push({ nome: 'TOTAL', quantidade: total_propostas_por_microrregiao, estilo: {negrito: true} }),
				cabecalho: cabecalho,
				titulo: 'Proposta por Microrregião'
			}
		end
	end

	def grafico_recursos_por_tipo_de_programa
		recursos_por_tipo_de_programa = Ppa::ProjecaoDeDespesa.recursos_por_tipo_de_programa ppa_atual.id
		total_recursos_por_tipo_programa = 0
		if recursos_por_tipo_de_programa.present?
			img_recurso_por_tipo_de_programa = grafico_pizza('Recurso por Tipo de Programas', recursos_por_tipo_de_programa)
			recursos_por_tipo_de_programa.map! { |recurso|
				total_recursos_por_tipo_programa += recurso[:quantidade]
				{
					nome: recurso[:nome],
					quantidade: recurso[:quantidade].real_contabil
				}
			}

			cabecalho = [{
				nome: 'Tipo de Programa',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Total',
				tamanho: 60,
				alinhamento: 'direita'
			}]

			{
				grafico: img_recurso_por_tipo_de_programa,
				tabela_dados: recursos_por_tipo_de_programa.push({nome: 'TOTAL', total: total_recursos_por_tipo_programa.real_contabil, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Recurso por Tipo de Programas'
			}
		end
	end

	def grafico_recurso_por_funcao_de_despesa
		recurso_por_funcao_de_despesa = Ppa::ProjecaoDeDespesa.recurso_por_funcao_de_despesa ppa_atual.id
		total_de_recurso_funcao_despesa = 0
		if recurso_por_funcao_de_despesa.present?
			img_recurso_por_funcao_de_despesa = grafico_pizza('Recurso por Função de Despesas', recurso_por_funcao_de_despesa)
			recurso_por_funcao_de_despesa.map! {|despesa|
				total_de_recurso_funcao_despesa += despesa[:quantidade]
				{
					nome: despesa[:nome],
					quantidade: despesa[:quantidade].real_contabil
				}
			}
			cabecalho = [{
				nome: 'Programa',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Total',
				tamanho: 60,
				alinhamento: 'direita'
			}]

			{
				grafico: img_recurso_por_funcao_de_despesa,
				tabela_dados: recurso_por_funcao_de_despesa.push({nome: 'TOTAL', total: total_de_recurso_funcao_despesa.real_contabil, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Recurso por Função de Despesas'
			}
		end
	end

	def grafico_fontes_de_financiamento_ppa_4_anos
		fonte_de_financiamento = ppa_atual.projecao_de_receita.total_agregado_projetado_das_origens_do_ppa
		total_fonte_de_financiamento = 0
		if fonte_de_financiamento.present?
			img_fonte_de_financiamento = grafico_barra("Fontes de Financiamento para 4 anos", fonte_de_financiamento)
			fonte_de_financiamento.map! { |fonte|
				total_fonte_de_financiamento += fonte[:quantidade]
				{
					nome: fonte[:nome],
					quantidade: fonte[:quantidade].real_contabil
				}
			}

			cabecalho = [{
				nome: 'Especificação',
				tamanho: 120,
				alinhamento: 'esquerda'
			},{
				nome: 'Valor Projetado',
				tamanho: 60,
				alinhamento: 'direita'
			}]

			{
				grafico: img_fonte_de_financiamento,
				tabela_dados: fonte_de_financiamento.push({nome: 'TOTAL', total: total_fonte_de_financiamento.real_contabil, estilo: {negrito: true}}),
				cabecalho: cabecalho,
				titulo: 'Fontes de Financiamento para 4 anos'
			}
		end
	end

	def grafico_fontes_de_financiamento_ppa_por_exercicio_sendo_3_ultimos_consolidados
		fontes_de_financiamento_ppa_por_exercicio(true)
	end

	def grafico_fontes_de_financiamento_ppa_por_exercicio
		fontes_de_financiamento_ppa_por_exercicio(false)
	end

	def fontes_de_financiamento_ppa_por_exercicio(consolida_3_ultimos_anos = false)

		if consolida_3_ultimos_anos
			fonte_de_financiamento_por_exercicio = ppa_atual.projecao_de_receita.total_agregado_projecao_consolidado_nos_3_ultimos_anos
		else
			fonte_de_financiamento_por_exercicio = ppa_atual.projecao_de_receita.total_agregado_projecao_por_exercicio
		end

		if fonte_de_financiamento_por_exercicio.present? && fonte_de_financiamento_por_exercicio.first[:receitas].present?
			fonte_de_financiamento_por_exercicio.map! { |fonte|

				total_fonte_de_financiamento_exercicio = 0

				cabecalho = [{
					nome: 'Fontes de Financiamento',
					tamanho: 110,
					alinhamento: 'esquerda'
					},{
						nome: 'Valor',
						tamanho: 50,
						alinhamento: 'direita'
					},{
						nome: '%',
						tamanho: 20,
						alinhamento: 'direita'
				}]

				total_fonte_de_financiamento_exercicio = fonte[:receitas].sum {|f| f[:quantidade] }

				{
					grafico: grafico_barra("Fontes de Financiamento em " + fonte[:exercicio].to_s, fonte[:receitas]),
					tabela_dados: fonte[:receitas].map! { |fonte_de_exercicio|
						porcentagem = total_fonte_de_financiamento_exercicio > 0 ? ((fonte_de_exercicio[:quantidade].to_f / total_fonte_de_financiamento_exercicio.to_f) * 100).round(2).real.to_s + "%" : porcentagem = "0%"
						{
							nome: fonte_de_exercicio[:nome],
							quantidade: fonte_de_exercicio[:quantidade].real_contabil,
							porcentagem: porcentagem
						}
					}.push({nome: 'TOTAL', total: total_fonte_de_financiamento_exercicio.real_contabil, percentual: "100,00%" , estilo: {negrito: true}}),
					cabecalho: cabecalho,
					titulo: 'Fontes de Financiamento por Exercícios'
				}
			}
		end
	end

	def grafico_recurso_por_eixos
		recurso_eixo_por_ppa = Ppa::Eixo.recursos_eixo_por_ppa ppa_atual.id
		total_recurso_por_eixos = 0
		if recurso_eixo_por_ppa.present? && !recurso_eixo_por_ppa.first[:quantidade].zero?
			img_recurso_por_funcao_de_despesa = grafico_pizza("Recursos por Eixos", recurso_eixo_por_ppa)
			total_recurso_por_eixos = recurso_eixo_por_ppa.sum {|r| r[:quantidade] }
			total_programa = recurso_eixo_por_ppa.sum {|r| r[:qtd_programas] }
			recurso_eixo_por_ppa.map! { |eixo|
				porcentagem = total_recurso_por_eixos > 0 ? ((eixo[:quantidade].to_f / total_recurso_por_eixos.to_f) * 100).round(2).real.to_s + "%" : porcentagem = "0%"
				{
					nome: eixo[:nome],
					valor: eixo[:quantidade].real_contabil,
					qtd_programas: eixo[:qtd_programas],
					porcentagem: porcentagem
				}
			}
			if recurso_eixo_por_ppa.present? && img_recurso_por_funcao_de_despesa.present?
				cabecalho = [{
					nome: 'Eixo',
					tamanho: 90,
					alinhamento: 'esquerda'
				},{
					nome: 'Valor',
					tamanho: 40,
					alinhamento: 'direita'
				},{
					nome: 'Programas',
					tamanho: 30,
					alinhamento: 'direita'
				},{
					nome: '%',
					tamanho: 20,
					alinhamento: 'direita'
				}]

				{
					grafico: img_recurso_por_funcao_de_despesa,
					tabela_dados: recurso_eixo_por_ppa.push({nome: 'TOTAL', total: total_recurso_por_eixos.real_contabil,quantidade: total_programa, porcentagem: "100,00%", estilo: {negrito: true}}),
					cabecalho: cabecalho,
					titulo: 'Recursos por Eixos'
				}
			end
		end
	end
end
