class Loa::Relatorios::CronogramaDeExecucaoMensalDeDesembolsoConsolidado

	def self.dados loa, percentuais, unidade_orcamentaria_id
		dados_do_relatorio = Array.new
		valor_total = 0
		lista_meses = [:janeiro, :fevereiro, :marco, :abril, :maio, :junho, :julho, :agosto, :setembro, :outubro, :novembro, :dezembro]
		totais_por_mes = lista_meses.inject({}) { |hash, mes| hash.merge( mes => 0 ) }

		loa.categorias_economicas.selecionados.order(:codigo).each do |categoria_economica|
			meses = busca_mes_a_mes(categoria_economica, percentuais, unidade_orcamentaria_id)
			dados_do_relatorio << {
				codigo: categoria_economica.descricao,
				valor: categoria_economica.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f,
				meses: meses,
				estilo: { negrito: true }
			}
			categoria_economica.grupos_de_natureza_da_despesa.order(:codigo).each {|grupo_de_natureza_da_despesa|
				meses = busca_mes_a_mes(grupo_de_natureza_da_despesa, percentuais, unidade_orcamentaria_id)
				dados_do_relatorio << {
					codigo: grupo_de_natureza_da_despesa.descricao,
					valor: grupo_de_natureza_da_despesa.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f,
					meses: meses
				}
			}
		end

		dados_do_relatorio.each do |dado_do_relatorio|
			valor_total += dado_do_relatorio[:valor].to_f if dado_do_relatorio[:estilo] && dado_do_relatorio[:estilo][:negrito]
			lista_meses.each do |mes|
				totais_por_mes[mes] += dado_do_relatorio[:meses][mes].to_f if dado_do_relatorio[:estilo] && dado_do_relatorio[:estilo][:negrito]
			end
		end

		dados_do_relatorio << {
			codigo: 'Total',
			valor: valor_total.to_s,
			meses: lista_meses.inject({}) {|hash, mes| hash.merge( mes => totais_por_mes[mes] ) }
		}
		return dados_do_relatorio
	end

	def self.busca_mes_a_mes elemento, percentuais, unidade_orcamentaria_id
		if percentuais.sum > 0
			meses = {
				janeiro: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[0]) / 100,
				fevereiro: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[1]) / 100,
				marco: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[2]) / 100,
				abril: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[3]) / 100,
				maio: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[4]) / 100,
				junho: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[5]) / 100,
				julho: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[6]) / 100,
				agosto: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[7]) / 100,
				setembro: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[8]) / 100,
				outubro: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[9]) / 100,
				novembro: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[10]) / 100,
				dezembro: (elemento.valor_total_fixado_dos_elementos_por_unidade_orcamentaria(unidade_orcamentaria_id).to_f * percentuais[11]) / 100,
			}
		else
			meses = {
				janeiro: elemento.valor_previsto_por_mes(1, unidade_orcamentaria_id),
				fevereiro: elemento.valor_previsto_por_mes(2, unidade_orcamentaria_id),
				marco: elemento.valor_previsto_por_mes(3, unidade_orcamentaria_id),
				abril: elemento.valor_previsto_por_mes(4, unidade_orcamentaria_id),
				maio: elemento.valor_previsto_por_mes(5, unidade_orcamentaria_id),
				junho: elemento.valor_previsto_por_mes(6, unidade_orcamentaria_id),
				julho: elemento.valor_previsto_por_mes(7, unidade_orcamentaria_id),
				agosto: elemento.valor_previsto_por_mes(8, unidade_orcamentaria_id),
				setembro: elemento.valor_previsto_por_mes(9, unidade_orcamentaria_id),
				outubro: elemento.valor_previsto_por_mes(10, unidade_orcamentaria_id),
				novembro: elemento.valor_previsto_por_mes(11, unidade_orcamentaria_id),
				dezembro: elemento.valor_previsto_por_mes(12, unidade_orcamentaria_id),
			}
		end
	end

end
