class Loa::Relatorios::QuadroDeEvolucaoDaDespesaPorFuncao

	def self.dados_do_relatorio loa_atual, funcao_id = ""
		loa_tres_anos_antes		= Orcamento.find_by( exercicio: "#{loa_atual.exercicio - 3}")
		loa_dois_anos_antes 	= Orcamento.find_by( exercicio: "#{loa_atual.exercicio - 2}")
		loa_um_ano_antes 			= Orcamento.find_by( exercicio: "#{loa_atual.exercicio - 1}")

		dados_evolucao_da_despesa = []
		dados_do_relatorio = []

		funcao_principal = Base::Funcao.where(id: funcao_id.to_i).first

		[ loa_tres_anos_antes, loa_dois_anos_antes, loa_um_ano_antes, loa_atual ].each { |loa|
			hash_evolucao_da_despesa_por_funcao = {}

			if funcao_id.to_i > 0
				funcoes =  loa.try(:funcoes).where(codigo: funcao_principal.codigo) if funcao_principal.present?
			else
				funcoes = loa.try(:funcoes)
			end

			funcoes.try(:each) { |funcao|
				if loa.try(:exercicio) < loa_atual.exercicio
					hash_evolucao_da_despesa_por_funcao[funcao.try(:codigo) + ' ' + funcao.try(:nome).to_s] = funcao.try(:valor_total_realizado_da_despesa_por_subfuncoes).to_f
				else
					hash_evolucao_da_despesa_por_funcao[funcao.try(:codigo) + ' ' + funcao.try(:nome).to_s] = funcao.try(:valor_total_fixado_da_despesa_por_subfuncoes).to_f
				end
			}

			dados_evolucao_da_despesa << hash_evolucao_da_despesa_por_funcao
		}

		total_geral_tres_anos_antes		= 0.0
		total_geral_dois_anos_antes 	= 0.0
		total_geral_um_ano_antes		= 0.0
		total_geral_atual				= 0.0

		especificacoes = dados_evolucao_da_despesa[3].keys
		especificacoes.each { |especificacao|
			dados_do_relatorio << {
				especificacao: especificacao,
				loa_tres_anos_antes: dados_evolucao_da_despesa[0][especificacao],
				percentual_tres_anos_antes: calcula_percentual( dados_evolucao_da_despesa[0][especificacao], loa_tres_anos_antes.try(:valor_total_realizado_da_despesa) ),
				loa_dois_anos_antes: dados_evolucao_da_despesa[1][especificacao],
				percentual_dois_anos_antes: calcula_percentual( dados_evolucao_da_despesa[1][especificacao], loa_dois_anos_antes.try(:valor_total_realizado_da_despesa) ),
				loa_um_ano_antes: dados_evolucao_da_despesa[2][especificacao],
				percentual_um_ano_anos_antes: calcula_percentual( dados_evolucao_da_despesa[2][especificacao], loa_um_ano_antes.try(:valor_total_fixado_da_despesa) ),
				loa_atual: dados_evolucao_da_despesa[3][especificacao],
				percentual_atual: calcula_percentual( dados_evolucao_da_despesa[3][especificacao], loa_atual.try(:valor_total_fixado_da_despesa) )
			}

			total_geral_tres_anos_antes += dados_evolucao_da_despesa[0][especificacao].to_f
			total_geral_dois_anos_antes += dados_evolucao_da_despesa[1][especificacao].to_f
			total_geral_um_ano_antes	+= dados_evolucao_da_despesa[2][especificacao].to_f
			total_geral_atual			+= dados_evolucao_da_despesa[3][especificacao].to_f
		}

		dados_do_relatorio << {
			especificacao: "TOTAL GERAL: ",
			loa_tres_anos_antes: total_geral_tres_anos_antes,
			percentual_tres_anos_antes: calcula_percentual( total_geral_tres_anos_antes, total_geral_tres_anos_antes ),
			loa_dois_anos_antes: total_geral_dois_anos_antes,
			percentual_dois_anos_antes: calcula_percentual( total_geral_dois_anos_antes, total_geral_dois_anos_antes ),
			loa_um_ano_antes: total_geral_um_ano_antes,
			percentual_um_ano_anos_antes: calcula_percentual( total_geral_um_ano_antes, total_geral_um_ano_antes ),
			loa_atual: total_geral_atual,
			percentual_atual: calcula_percentual( total_geral_atual, total_geral_atual ),
			estilo: { negrito: 'true' }
		}

		return dados_do_relatorio
	end

	def self.calcula_percentual valor, valor_total
		return valor_total.to_f > 0 ? ( (valor.to_f * 100) / valor_total.to_f ).round(2) : 0.0
	end

	private_class_method :calcula_percentual
end
