require 'httparty'

module ImportacaoTcm
	class ContabilidadeEstornosDeLiquidacao
		@@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|
					estornos_de_liquidacoes = Array.new
					# puts "CARREGANDO ESTORNOS DE LIQUIDAÇÕES 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_estornos_liquidacoes = importar_dados_estornos_de_liquidacoes( codigo_do_municipio, exercicio, codigo_do_orgao, codigo_da_unidade_orcamentaria )
						estornos_de_liquidacoes.concat(dados_estornos_liquidacoes) unless dados_estornos_liquidacoes.nil?
					end
					criar_estornos_de_liquidacoes( estornos_de_liquidacoes, contabilidade, codigo_do_orgao ) if estornos_de_liquidacoes.size > 0
				end
			end

			def criar_estornos_de_liquidacoes dados_estornos_liquidacoes, contabilidade, codigo_do_orgao
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: "ESTORNOS DE LIQUIDAÇÕES DO ÓRGÃO #{codigo_do_orgao}", total: dados_estornos_liquidacoes.size ) unless Rails.env == "test"
				dados_estornos_liquidacoes.each do |estorno|
					empenho = Contabilidade::Empenho.find_by(numero_do_empenho: estorno['numero_empenho'])
					if empenho
						liquidacao = Contabilidade::Liquidacao.find_by(data_da_liquidacao: estorno['data_liquidacao'], empenho_id: empenho.id)
						if liquidacao
							estorno_de_liquidacao =  Contabilidade::EstornoDeLiquidacao.new(
								liquidacao_id: liquidacao.id,
								data_do_estorno: estorno['data_estorno_liquidacao'],
								justificativa: estorno['descricao_justificativa']
							)
							estorno_de_liquidacao.save(validate: false)
						# else
							# puts "Liquidacao da data #{estorno['data_liquidacao']} não encontrada."
						end
					# else
						# puts "Empenho de numero #{estorno['numero_empenho']} não encontrado."
					end
					progress_bar.increment unless Rails.env == "test"
				end
			end

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