require 'httparty'

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

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

				::Loa::Orgao.where(orcamento_id: orcamento.id).order(:codigo).pluck(:id, :codigo).map do |orgao_id, codigo_do_orgao|
					pagamentos = Array.new
					# puts "CARREGANDO PAGAMENTOS 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|
						for mes_referencia_do_pagamento in 1..12
							dados_pagamentos = importar_dados_pagamentos( codigo_do_municipio, exercicio, codigo_do_orgao, codigo_da_unidade_orcamentaria, mes_referencia_do_pagamento )
							pagamentos.concat(dados_pagamentos) unless dados_pagamentos.nil?
						end
					end
					criar_pagamentos( pagamentos, orcamento, codigo_do_orgao ) if pagamentos.size > 0
				end
			end

			def criar_pagamentos dados_pagamentos, orcamento, codigo_do_orgao
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: "PAGAMENTOS DO ÓRGÃO #{codigo_do_orgao}", total: dados_pagamentos.size ) unless Rails.env == "test"

				dados_pagamentos.each do |pagamento|

					# Buscando Liquidação(ões)
					empenho = ::Contabilidade::Empenho.find_by( orcamento_id: orcamento.id, numero_do_empenho: pagamento['numero_empenho'] )
					if empenho.present?
						#todo - Ajustar a busca pela Liquidação, pois alguns pagamentos batem e outros não.
						liquidacao = ::Contabilidade::Liquidacao.find_by( empenho_id: empenho.id, data_da_liquidacao: pagamento['data_nota_pagamento'] )
						# Criando Pagamento(s)
						if liquidacao.present?
							pagamento = Contabilidade::Pagamento.new(
								liquidacao_id: liquidacao.id,
								numero: pagamento['numero_nota_pagamento'],
								estornado: definir_estado_de_estornado( pagamento['estado_de_estornado'] ),
								data: pagamento['data_nota_pagamento'].to_date.to_s,
								valor: pagamento['valor_nota_pagamento'],
								numero_de_caixa: pagamento['nu_documento_caixa'],
								prepagamento: false,
								skip_validacao: true
							)

							pagamento.save!(validate: false)
						end
					end

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

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

		def self.definir_estado_de_estornado estado_de_estornado
			if estado_de_estornado.to_i.eql?(0)
				return false
			else
				return true
			end
		end

		private_class_method :definir_estado_de_estornado
	end
end
