require 'httparty'

module ImportacaoTcm
	class ContabilidadeAnulacoesDoEmpenho
		@@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

				::Loa::Orgao.where(orcamento_id: contabilidade.id).order(:codigo).pluck(:id, :codigo).map do |orgao_id, codigo_do_orgao|
					anulacoes_do_empenho = Array.new
					# puts "CARREGANDO ANULAÇÕES DE EMPENHO DO ÓRGÃO #{codigo_do_orgao}..."
					::Loa::UnidadeOrcamentaria.where(orgao_id: orgao_id, importar_dependencias: true).order(:codigo).pluck(:codigo).map do |codigo_da_unidade_orcamentaria|
						dados_anulacaoes_do_empenho = importar_dados_anulacaoes_do_empenho( codigo_do_municipio, exercicio, codigo_do_orgao, codigo_da_unidade_orcamentaria )
						anulacoes_do_empenho.concat(dados_anulacaoes_do_empenho) unless dados_anulacaoes_do_empenho.nil?
					end
					criar_anulacao_do_empenho( anulacoes_do_empenho, contabilidade, codigo_do_orgao ) if anulacoes_do_empenho.size > 0
				end
			end

			def criar_anulacao_do_empenho dados_anulacaoes_do_empenho, contabilidade, codigo_do_orgao
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: "ANULAÇÕES DE EMPENHO DO ÓRGÃO #{codigo_do_orgao}", total: dados_anulacaoes_do_empenho.size ) unless Rails.env == "test"
				dados_anulacaoes_do_empenho.each do |anulacao_do_empenho|

					empenho = Contabilidade::Empenho.find_by(numero_do_empenho: anulacao_do_empenho['numero_empenho'])

					tipo_de_anulacao = :total if anulacao_do_empenho['modalidade_anulacao'].to_s.strip == 'T'
					tipo_de_anulacao = :parcial if anulacao_do_empenho['modalidade_anulacao'].to_s.strip == 'P'

					if empenho
						anulacao_do_empenho = Contabilidade::AnulacaoDoEmpenho.new(
							empenho_id: empenho.id,
							numero: anulacao_do_empenho['numero_anulacao'],
							data_da_anulacao: anulacao_do_empenho['data_anulacao'],
							tipo_de_anulacao: tipo_de_anulacao,
							valor: anulacao_do_empenho['valor_anulacao'].to_f,
							historico: anulacao_do_empenho['descricao_anulacao']
						)
						anulacao_do_empenho.save(validate: false)
					else
						# puts "#{anulacao_do_empenho['codigo_orgao']} - #{anulacao_do_empenho['codigo_unidade']} - #{anulacao_do_empenho['numero_empenho']} - #{anulacao_do_empenho['numero_anulacao']}"
					end

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

			def importar_dados_anulacaoes_do_empenho codigo_do_municipio, exercicio, codigo_do_orgao, codigo_da_unidade_orcamentaria
				begin
					response = HTTParty.get("#{@@host}/anulacoes_empenhos.xml?codigo_municipio=#{codigo_do_municipio}&exercicio_orcamento=#{exercicio}00&codigo_orgao=#{codigo_do_orgao}&codigo_unidade=#{codigo_da_unidade_orcamentaria}")
					dados_anulacaoes_do_empenho = Hash.from_xml(response.body.encode(Encoding::UTF_8))['rsp']['anulacoes_empenhos']
					if dados_anulacaoes_do_empenho.is_a?(Array)
						return dados_anulacaoes_do_empenho
					else
						if dados_anulacaoes_do_empenho.nil?
							return nil
						else
							return dados_anulacaoes_do_empenho_array = [ dados_anulacaoes_do_empenho ]
						end
					end
				rescue
					puts "Página não encontrada, tentando novamente..."
					sleep 5
					importar_dados_anulacaoes_do_empenho codigo_do_municipio, exercicio, codigo_do_orgao, codigo_da_unidade_orcamentaria
					return nil
				end
			end
		end
	end
end
