require 'httparty'

module ImportacaoTcm
	class ContabilidadeEmpenhos
		@@host = 'https://api.tce.ce.gov.br/index.php/sim/1_0'

		class << self
			def importar codigo_do_municipio, exercicio
				contabilidade = Orcamento.find_by(exercicio: exercicio)
				if contabilidade.nil?
					ImportacaoTcm::Loa.importar(codigo_do_municipio, exercicio)
					contabilidade = Orcamento.find_by(exercicio: exercicio)
				end

				for mes_referencia_do_empenho in 1..12
					empenhos = Array.new
					# puts "CARREGANDO EMPENHOS DO MÊS #{mes_referencia_do_empenho.digitos(2)}..."
					contabilidade.orgaos.pluck(:codigo).map do |codigo_do_orgao|
						dados_empenhos = importar_dados_empenhos( codigo_do_municipio, codigo_do_orgao, exercicio, mes_referencia_do_empenho )
						empenhos.concat(dados_empenhos) unless dados_empenhos.nil?
					end
					criar_empenhos( empenhos, contabilidade, mes_referencia_do_empenho ) if empenhos.size > 0
				end
			end

			def criar_empenhos dados_empenhos, contabilidade, mes_referencia_do_empenho
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: "EMPENHOS DO MÊS #{mes_referencia_do_empenho.digitos(2)}", total: dados_empenhos.size ) unless Rails.env == "test"

				dados_empenhos.each do |empenho|

					fonte_de_recurso = contabilidade.fontes_de_recursos.find_by( codigo: empenho['codigo_fonte'].try(:strip) )
					natureza_da_acao = contabilidade.naturezas_da_acao.find_by(codigo: empenho['codigo_projeto_atividade'].try(:strip) )
					acao = ::Loa::Acao.find_by(codigo: empenho['numero_projeto_atividade'].strip, natureza_da_acao_id: natureza_da_acao.try(:id) )
					subacao = ::Loa::Subacao.find_by(acao: acao.id, codigo: empenho['numero_subprojeto_atividade'].strip)
					elemento_de_despesa = contabilidade.elementos_de_despesa.find_by(codigo: empenho['codigo_elemento_despesa'].strip)
					elemento_de_despesa_por_subacao = ::Loa::ElementoDeDespesaPorSubacao.find_by(elemento_de_despesa: elemento_de_despesa.try(:id), subacao: subacao.try(:id))
					orcamento_da_despesa = ::Loa::OrcamentoDaDespesa.find_by( fonte_de_recursos_id: fonte_de_recurso.try(:id), elemento_de_despesa_por_subacao_id: elemento_de_despesa_por_subacao.try(:id) )

					pessoa = ::Base::Pessoa.find_by( nome: empenho['nome_negociante'] )
					estado = ::Base::Estado.find_by( uf: empenho['codigo_uf'])
					cidade = ::Base::Cidade.where( "estado_id = ? and unaccent(nome) ilike unaccent(?)", estado.id, empenho['nome_municipio_negociante'])

					if orcamento_da_despesa.present?
						# só adiciona se pertence às unidades autorizadas a importar dependência
						if orcamento_da_despesa.unidade_orcamentaria.importar_dependencias

							unless pessoa.present?
								pessoa = ::Base::Pessoa.new(
								cidade_id: cidade.try(:first).try(:id),
								nome: empenho['nome_negociante'],
								cep: empenho['cep_negociante'],
								telefone: empenho['fone_negociante'],
								logradouro: empenho['endereco_negociante']
								)
							end

							pessoa.save!(validate: false)

							empenho = Contabilidade::Empenho.new(
								orcamento_id: contabilidade.id,
								numero_do_empenho: empenho['numero_empenho'].to_i,
								pessoa_id: pessoa.id,
								orcamento_da_despesa_id: orcamento_da_despesa.id,
								modalidade: definir_modalidade_do_empenho( empenho['modalidade_empenho'] ),
								data_do_empenho: empenho['data_emissao_empenho'],
								historico: empenho['descricao_empenho'].strip,
								valor: empenho['valor_empenhado'].to_f
							)

							empenho.save!(validate: false)
						end
					else
						# puts "#{empenho['codigo_orgao'].strip} - #{empenho['codigo_unidade'].strip} - #{empenho['numero_empenho'].strip} - #{empenho['data_referencia_empenho'].strip}"
					end

					progress_bar.increment unless Rails.env == "test"
				end
			end

			def importar_dados_empenhos codigo_do_municipio, codigo_do_orgao, exercicio, mes_referencia_do_empenho
				response = HTTParty.get("#{@@host}/notas_empenhos.xml?codigo_municipio=#{codigo_do_municipio}&codigo_orgao=#{codigo_do_orgao}&data_referencia_empenho=#{exercicio}#{mes_referencia_do_empenho.digitos(2)}")
				begin
					dados_empenhos = Hash.from_xml(response.body.encode(Encoding::UTF_8))['rsp']['notas_empenhos']
					if dados_empenhos.is_a?(Array)
						return dados_empenhos
					else
						if dados_empenhos.nil?
							return nil
						else
							return  [ dados_empenhos ]
						end
					end
				rescue
					puts "Página não encontrada, tentando novamente..."
					sleep 5
					importar_dados_empenhos codigo_do_municipio, codigo_do_orgao, exercicio, mes_referencia_do_empenho
					return nil
				end
			end
		end

		def self.definir_modalidade_do_empenho modalidade
			if modalidade.eql?'O'
				return 'ordinario'
			elsif modalidade.eql?'E'
				return 'estimativo'
			else
				return 'global'
			end
		end

		private_class_method :definir_modalidade_do_empenho
	end
end
