class Loa::Relatorios::QuadroDeDetalhamentoDaLoa

	def self.dados loa_atual
		orgaos = Array.new
		loa_atual.orgaos.order(:codigo).each do |orgao|
			total_unidades = 0
			unidades_orcamentarias = Array.new
			orgao.unidades_orcamentarias.order(:codigo).each do |unidade_orcamentaria|
				total_unidades += unidade_orcamentaria.valor_total_fixado_da_despesa
				quadro_sintese = Array.new

				# PROGRAMAS DE GOVERNO
				quadro_sintese << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Programa",
					coluna_2: ""
				}
				unidade_orcamentaria.programas_de_governo.each do |programa_de_governo|
					quadro_sintese << {
						tipo: "normal_3",
						coluna_1: "#{programa_de_governo.codigo}",
						coluna_2: "#{programa_de_governo.nome.try(:upcase)}",
						coluna_3: "#{programa_de_governo.valor_total_fixado_da_despesa_por_unidade(unidade_orcamentaria).try(:contabil)}"
					}
				end

				# FUNÇÕES
				quadro_sintese << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Função",
					coluna_2: ""
				}
				unidade_orcamentaria.funcoes.distinct.each do |funcao|
					quadro_sintese << {
						tipo: "normal_3",
						coluna_1: "#{funcao.codigo}",
						coluna_2: "#{funcao.nome.try(:upcase)}",
						coluna_3: "#{funcao.valor_total_fixado_da_despesa_por_unidade(unidade_orcamentaria).try(:contabil)}"
					}
				end

				# SUBFUNÇÕES
				quadro_sintese << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Subfunção",
					coluna_2: ""
				}
				unidade_orcamentaria.subfuncoes.distinct.each do |subfuncao|
					quadro_sintese << {
						tipo: "normal_3",
						coluna_1: "#{subfuncao.codigo}",
						coluna_2: "#{subfuncao.nome.try(:upcase)}",
						coluna_3: "#{subfuncao.valor_total_fixado_da_despesa_por_unidade(unidade_orcamentaria).try(:contabil)}"
					}
				end

				# GRUPOS DE NATUREZA DA DESPESA
				quadro_sintese << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Grupo de Natureza de Despesa",
					coluna_2: ""
				}
				unidade_orcamentaria.grupos_de_natureza_da_despesa.order(:codigo).distinct.each do |grupo_de_natureza_da_despesa|
					quadro_sintese << {
						tipo: "normal_3",
						coluna_1: "#{grupo_de_natureza_da_despesa.codigo[1]}",
						coluna_2: "#{grupo_de_natureza_da_despesa.descricao.try(:upcase)}",
						coluna_3: "#{grupo_de_natureza_da_despesa.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria).try(:contabil)}"
					}
				end

				# MODALIDADES DE APLICAÇÃO
				quadro_sintese << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Modalidade de Aplicação",
					coluna_2: ""
				}
				modalidades = unidade_orcamentaria.modalidades_de_aplicacao.select("substring(base_modalidades_de_aplicacao.codigo, 3, 2) as codigo").group("substring(base_modalidades_de_aplicacao.codigo, 3, 2) ").order("substring(base_modalidades_de_aplicacao.codigo, 3, 2)")
				modalidades.each do |modalidade|
					modalidade_de_aplicacao = unidade_orcamentaria.modalidades_de_aplicacao.where("substring(base_modalidades_de_aplicacao.codigo, 3, 2) = ?", modalidade[:codigo]).first
					valor_total = unidade_orcamentaria.modalidades_de_aplicacao.where("substring(base_modalidades_de_aplicacao.codigo, 3, 2) = ?", modalidade[:codigo]).inject(0) { |total, modalidade_de_aplicacao|
						total + modalidade_de_aplicacao.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria).to_f
					}
					quadro_sintese << {
						tipo: "normal_3",
						coluna_1: "#{modalidade[:codigo]}",
						coluna_2: "#{modalidade_de_aplicacao.descricao.try(:upcase)}",
						coluna_3: "#{valor_total.try(:contabil)}"
					}
				end

				# # ELEMENTO DE DESPESA
				# quadro_sintese << {
				# 	tipo: "titulo",
				# 	estilo: "negrito linha-destaque",
				# 	coluna_1: "Elemento de Despesa",
				# 	coluna_2: ""
				# }
				# unidade_orcamentaria.elementos_de_despesa.order(:codigo).distinct.each do |elemento_de_despesa|
				# 	quadro_sintese << {
				# 		tipo: "normal_3",
				# 		coluna_1: "#{elemento_de_despesa.codigo_formatado}",
				# 		coluna_2: "#{elemento_de_despesa.descricao.try(:upcase)}",
				# 		coluna_3: "#{elemento_de_despesa.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria).try(:contabil)}"
				# 	}
				# end

				# FONTES DE RECURSOS
				quadro_sintese << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Fonte de Recurso",
					coluna_2: ""
				}
				unidade_orcamentaria.fontes_de_recursos.order(:codigo).distinct.each do |fonte_de_recurso|
					quadro_sintese << {
						tipo: "normal_3",
						coluna_1: "#{fonte_de_recurso.codigo}",
						coluna_2: "#{fonte_de_recurso.descricao.try(:upcase)}",
						coluna_3: "#{fonte_de_recurso.valor_previsto_por_unidade_orcamentaria(unidade_orcamentaria).try(:contabil)}"
					}
				end


				quadro_de_creditos_orcamentarios = Array.new

				quadro_de_creditos_orcamentarios << {
					tipo: "titulo",
					estilo: "negrito linha-destaque",
					coluna_1: "Programática",
					coluna_2: "Programa/Ação/Produto",
					coluna_3: "Funcional",
					coluna_4: "Esf",
					coluna_5: "GND",
					coluna_6: "Mod",
					coluna_7: "IU",
					coluna_8: "Fte",
					coluna_9: "Valor"
				}

				# PROGRAMAS DE GOVERNO
				unidade_orcamentaria.programas_de_governo.order(:codigo).each do |programa_de_governo|
					quadro_de_creditos_orcamentarios << {
						tipo: "normal",
						estilo: "",
						coluna_1: "<b>#{programa_de_governo.codigo}</b>",
						coluna_2: "#{programa_de_governo.nome}",
						coluna_3: "",
						coluna_4: "",
						coluna_5: "",
						coluna_6: "",
						coluna_7: "",
						coluna_8: "",
						coluna_9: "#{programa_de_governo.valor_total_fixado_da_despesa_por_unidade(unidade_orcamentaria).try(:contabil)}"
					}

					programa_de_governo.subacoes.joins(acao: :natureza_da_acao).order("loa_acoes.codigo, base_naturezas_das_acoes.codigo, loa_subacoes.codigo").each do |subacao|

						quadro_de_creditos_orcamentarios << {
							tipo: "normal",
							estilo: "tabulacao_1",
							coluna_1: "#{programa_de_governo.codigo} #{loa_atual.trabalha_com_subacao ? "#{subacao.acao.codigo_completo_sem_ponto} <b>#{subacao.codigo}</b>" : "<b>#{subacao.acao.codigo_completo_sem_ponto}</b>"}",
							coluna_2: "<b>#{subacao.acao.nome}</b>",
							coluna_3: "<b>#{subacao.subfuncao.funcao.codigo} #{subacao.subfuncao.codigo}</b>",
							coluna_4: "",
							coluna_5: "",
							coluna_6: "",
							coluna_7: "",
							coluna_8: "",
							coluna_9: "#{subacao.valor_total_fixado_da_despesa.try(:contabil)}"
						}

						orcamentos_da_despesa = Array.new
						subacao.orcamentos_da_despesa.each do |orcamento_da_despesa|
							orcamentos_da_despesa << {
								esfera: "#{orcamento_da_despesa.elemento_de_despesa_por_subacao.subacao.tipo_de_orcamento.descricao_abreviada}",
								grupo: "#{orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.modalidade_de_aplicacao.grupo_de_natureza_da_despesa.codigo_abreviado}",
								modalidade: "#{orcamento_da_despesa.elemento_de_despesa_por_subacao.elemento_de_despesa.modalidade_de_aplicacao.codigo[2..3]}",
								iduso: "#{orcamento_da_despesa[:iduso]}",
								fonte: "#{orcamento_da_despesa.fonte_de_recursos.codigo_completo}",
								valor: "#{orcamento_da_despesa.valor}"
							}
						end
						orcamentos_da_despesa.group_by {|x| [x[:esfera], x[:grupo], x[:modalidade], x[:iduso], x[:fonte]]}.each do |orcamento_da_despesa|

							quadro_de_creditos_orcamentarios << {
								tipo: "normal",
								estilo: "",
								coluna_1: "",
								coluna_2: "",
								coluna_3: "",
								coluna_4: "#{orcamento_da_despesa[1][0][:esfera]}",
								coluna_5: "#{orcamento_da_despesa[1][0][:grupo]}",
								coluna_6: "#{orcamento_da_despesa[1][0][:modalidade]}",
								coluna_7: "#{orcamento_da_despesa[1][0][:iduso]}",
								coluna_8: "#{orcamento_da_despesa[1][0][:fonte]}",
								coluna_9: "#{orcamento_da_despesa[1].inject(0){|total, x| total + x[:valor].to_f}.try(:contabil)}"
							}
						end

						subacao.metas_fisicas.each do |meta_fisica|
							quadro_de_creditos_orcamentarios << {
								tipo: "normal",
								estilo: "tabulacao_2",
								coluna_1: "",
								coluna_2: "#{meta_fisica.produto} - " + "#{meta_fisica.quantidade_atual_da_meta_fisica}",
								coluna_3: "",
								coluna_4: "",
								coluna_5: "",
								coluna_6: "",
								coluna_7: "",
								coluna_8: "",
								coluna_9: "",
							}
						end
					end

					quadro_de_creditos_orcamentarios << {
						tipo: "normal",
						estilo: "ultima-linha",
						coluna_1: "TOTAL",
						coluna_2: "",
						coluna_3: "",
						coluna_4: "",
						coluna_5: "",
						coluna_6: "",
						coluna_7: "",
						coluna_8: "",
						coluna_9: "#{unidade_orcamentaria.valor_total_fixado_da_despesa.try(:contabil)}"
					}
				end

				unidades_orcamentarias << {
					nome: unidade_orcamentaria.nome,
					valor: unidade_orcamentaria.valor_total_fixado_da_despesa.try(:contabil),
					codigo: unidade_orcamentaria.codigo_completo,
					quadro_sintese: quadro_sintese,
					quadro_de_creditos_orcamentarios: quadro_de_creditos_orcamentarios}
			end
			orgaos << {codigo: orgao.codigo, nome: orgao.nome, unidades_orcamentarias: unidades_orcamentarias, total: total_unidades}
		end

		return orgaos
	end

end
