require 'active_support/concern'

module SeedGruposDasFontesDeRecursos extend ActiveSupport::Concern

	def cria_fontes_de_recursos
		(self.exercicio.to_i > 2018) ? cria_fontes_stn : cria_fontes_de_recursos_legados
	end

	def cria_fontes_stn
		ActiveRecord::Base.transaction do
			begin
				ActiveSupport::JSON.decode(File.read("db/data_seeds/fontes_de_recursos/#{exercicio}/stn.json")).each do |fonte|
					fonte1 = self.fontes_stn.find_or_create_by!(fonte.merge("codigo_tipo_exercicio" => 1))
					fonte2 = self.fontes_stn.find_or_create_by!(fonte.merge("codigo_tipo_exercicio" => 2))
					fonte3 = self.fontes_stn.find_or_create_by!(fonte.merge("codigo_tipo_exercicio" => 9))

					if fonte1.nil?
						p "Problema ao criar a fonte #{fonte} com tipo 1"
						self.fontes_stn.create(fonte.merge("codigo_tipo_exercicio" => 1))
					end

					if fonte2.nil?
						p "Problema ao criar a fonte #{fonte} com tipo 2"
						self.fontes_stn.create(fonte.merge("codigo_tipo_exercicio" => 2))
					end

					if fonte3.nil?
						p "Problema ao criar a fonte #{fonte} com tipo 9"
						self.fontes_stn.create(fonte.merge("codigo_tipo_exercicio" => 9))
					end
				end
			rescue Exception => e
				@_errors = true
				p "Erro na criação das fontes."
				p "Detalhes do erro: #{e.message} Top Backtrace: #{e.backtrace.first}" if e.message
				raise ActiveRecord::Rollback
			end
		end

		ActiveSupport::JSON.decode(File.read("db/data_seeds/fontes_de_recursos/#{exercicio}/tce.json")).each do |fonte_tce|
			fonte_tce["codigo"] = fonte_tce.delete "detalhamento_analitico"
			fonte_tce["descricao"] = fonte_tce.delete "nomenclatura_analitica"
			fontes_stn = self.fontes_stn.where(fonte_tce.slice("codigo_principal", "detalhamento_sintetico"))
			fontes_stn.each do |stn|
				fonte_stn = self.fontes_de_recursos.find_or_create_by!(fonte_tce.slice("codigo", "descricao").merge(type: "Base::FontesDeRecursos::FonteTCE", fonte_stn_id: stn.id))

				if fonte_stn.nil?
					p "Problema ao criar a fonte tce #{fonte_tce}"
					self.fontes_de_recursos.create(fonte_tce.slice("codigo", "descricao").merge(type: "Base::FontesDeRecursos::FonteTCE", fonte_stn_id: stn.id))
				end
			end
		end

		# COPIA OS VINCULOS DAS FONTES A PARTIR DO ANO ANTERIOR
		importa_configuracoes_das_fontes_de_recursos_do_ano_anterior
	end

	def cria_fontes_de_recursos_legados
		unless Rails.env.test?

			# GRUPOS DAS FONTES DE RECURSOS
			self.grupos_das_fontes_de_recursos.find_or_create_by!(codigo: "1", descricao: "Recursos do Tesouro")
			self.grupos_das_fontes_de_recursos.find_or_create_by!(codigo: "2", descricao: "Recursos de Outras Fontes")

			recurso_do_tesouro = self.grupos_das_fontes_de_recursos.find_by(codigo: '1')
			recurso_de_outras_fontes = self.grupos_das_fontes_de_recursos.find_by(codigo: '2')
			# RECURSOS ORDINÁRIOS
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "01", descricao: "Recursos Ordinarios", tipo_de_arrecadacao: 0, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 13)

			# RECURSOS VINCULADOS
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "02", descricao: "Receitas de Impostos e de Transferência de Impostos - Educação 25%", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 2)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "03", descricao: "Receitas de Impostos e de Transferência de Impostos - Saúde 15%", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 4)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "04", descricao: "Contribuição para o Regime Próprio de Previdência Social - RPPS Compensação Financeira", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_de_outras_fontes.id, classificacao_da_fonte_de_recursos_id: 9)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "05", descricao: "Contribuição para o Regime Próprio de Previdência Social - RPPS Plano Previdênciario", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_de_outras_fontes.id, classificacao_da_fonte_de_recursos_id: 7)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "06", descricao: "Contribuição para o Regime Próprio de Previdência Social - RPPS Plano Financeiro", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_de_outras_fontes.id, classificacao_da_fonte_de_recursos_id: 8)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "07", descricao: "Outros Recursos Vinculados à Saúde", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 5)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "08", descricao: "Outros Recursos Vinculados à Educação", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 3)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "09", descricao: "Transferência de Recursos do Sistema Único de Saúde - SUS", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 5)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "10", descricao: "Transferência de Recursos do Fundo Nacional do Desenvolvimento da Educação - FNDE", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 3)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "11", descricao: "Contribuição de Intervenção do Domínio Econômico - CIDE", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "12", descricao: "Contribuição para o Custeio dos Serviços de Iluminação Pública - COSIP", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "13", descricao: "Transferências do FUNDEB - 60% (aplicação na remuneração e aperfeiçoamento dos profissionais do Magistério em efetivo exercício na Educação Básica)", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 3)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "14", descricao: "Transferências do FUNDEB - 40% (aplicação em outras despesas da Educação Básica)", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 3)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "15", descricao: "Transferências de Convênios - União/Educação", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 3)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "16", descricao: "Transferências de Convênios - União/Saúde", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 5)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "17", descricao: "Transferências de Convênios - União/Assistência Social", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 6)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "18", descricao: "Transferências de Convênios - União/Outros (não relacionados à educação/saúde/assistência social)", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "19", descricao: "Transferências de Convênios - Estado/Educação", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 3)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "20", descricao: "Transferências de Convênios - Estado/Saúde", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 5)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "21", descricao: "Transferências de Convênios - Estado/Assistência Social", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 6)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "22", descricao: "Transferências de Convênios - Estado/Outros (não relacionados à educação/saúde/assistência social)", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "23", descricao: "Transferências de Convênios - Outros", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "24", descricao: "Transferência de Recursos do Fundo Nacional de Assistência Social - FNAS", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 6)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "25", descricao: "Transferência de Recursos do Fundo Nacional de Habitação de Interesse Social FNHIS", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "26", descricao: "Recursos Destinados aos Direitos da Criança e do Adolescente", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 6)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "27", descricao: "Recursos Destinados ao Meio Ambiente", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "28", descricao: "Multas de Trânsito", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "29", descricao: "Taxas Vinculadas", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "30", descricao: "Recursos Vinculados de Royalties", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "31", descricao: "Operações de Crédito", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 10)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "32", descricao: "Alienação de Bens", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 11)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "33", descricao: "Recursos Vinculados da Administração Indireta", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_de_outras_fontes.id, classificacao_da_fonte_de_recursos_id: 12)
			self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "35", descricao: "Taxa de Administração - Adm. Indireta", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_de_outras_fontes.id, classificacao_da_fonte_de_recursos_id: 12)
			if self.exercicio >= 2018
				self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "34", descricao: "Recurso Vinculados que não se enquadram nas demais especificações", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 11)
				self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "36", descricao: "Transferência de Recurso do Fundo Estadual de Assistência Social - FEAS", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 6)
			else
				self.fontes_de_recursos.create!(type: 'Base::FontesDeRecursos::Fonte2018', codigo: "34", descricao: "Recursos Vinculados que não se enquadram nas Especificações Anteriores", tipo_de_arrecadacao: 1, grupo_da_fonte_de_recursos_id: recurso_do_tesouro.id, classificacao_da_fonte_de_recursos_id: 11)
			end
		end
	end

	def importa_configuracoes_das_fontes_de_recursos_do_ano_anterior
		if self.orcamento_anterior.present?
			fontes_do_exercicio_anterior = self.orcamento_anterior.fontes_de_recursos.index_by(&:codigo_completo)
			self.fontes_de_recursos.all.each do |fonte_de_recursos|
				fonte_do_exercicio_anterior = fontes_do_exercicio_anterior[fonte_de_recursos.codigo_completo]

				if fonte_do_exercicio_anterior.present?
					fonte_de_recursos.update_columns(
						tipo_de_vinculo: fonte_do_exercicio_anterior.tipo_de_vinculo,
						fonte_vinculada: fonte_do_exercicio_anterior.fonte_vinculada
					)
				end
			end
		end

		return nil
	end
end
