require 'httparty'

module ImportacaoTcm
	class ContabilidadeAnulacoesDoTalaoDeReceita
		@@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_da_receita = Array.new
					anulacoes_da_receita = ::Loa::UnidadeOrcamentaria.where(orgao_id: orgao_id, importar_dependencias: true).order(:codigo).pluck(:codigo).map do |codigo_da_unidade_orcamentaria|
						dados_anulacoes_da_receita = importar_dados_anulacoes_de_receita( codigo_do_municipio, exercicio, codigo_do_orgao, codigo_da_unidade_orcamentaria )
						dados_anulacoes_da_receita
					end
					anulacoes_da_receita.compact!
					criar_anulacao_do_talao_de_receita( anulacoes_da_receita.first, contabilidade, codigo_do_orgao ) if anulacoes_da_receita.size > 0
				end
			end

			def criar_anulacao_do_talao_de_receita dados_anulacoes_da_receita, contabilidade, codigo_do_orgao
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: "ANULAÇÕES DE TALÃO DE RECEITA DO ÓRGÃO #{codigo_do_orgao}", total: dados_anulacoes_da_receita.size ) unless Rails.env == "test"
				dados_anulacoes_da_receita.each do |anulacao_da_receita|
					talao_de_receita = Contabilidade::TalaoDeReceita.find_by(numero_do_talao: anulacao_da_receita['numero_talao_receita'].to_i)

					tipo_de_anulacao = :total if anulacao_da_receita['md_anul_atr'].to_s.strip == 'T'
					tipo_de_anulacao = :parcial if anulacao_da_receita['md_anul_atr'].to_s.strip == 'P'

					if talao_de_receita
						anulacao_da_receita = Contabilidade::AnulacaoDoTalaoDeReceita.new(
							talao_de_receita_id: talao_de_receita.id,
							data_da_anulacao: anulacao_da_receita['data_anulacao'],
							tipo_de_anulacao: tipo_de_anulacao,
							valor: anulacao_da_receita['valor_anulacao'].to_f,
							historico: anulacao_da_receita['historico_anulacao']
						)
						anulacao_da_receita.save(validate: false)
					else
						p "Taão de receita não encontrado. Número do Talão: #{anulacao_da_receita['numero_talao_de_receita']}"
					end

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

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