require 'httparty'

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

				for i in 1..12
					dados_taloes_de_receitas = importar_dados_taloes_de_receita(codigo_do_municipio, exercicio, i)
					criar_taloes_de_receita(dados_taloes_de_receitas, orcamento, i) unless dados_taloes_de_receitas.nil?
				end
			end

			def criar_taloes_de_receita dados_taloes_de_receitas, orcamento, mes
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: "TALÕES DE RECEITA DO MÊS #{mes.digitos(2)}", total: dados_taloes_de_receitas.size ) unless Rails.env == "test"
				dados_taloes_de_receitas.each do |talao_de_receita_tcm|

					# pesquisa orçamento da receita
					fonte_de_recursos = Base::FonteDeRecursos.find_by(codigo: talao_de_receita_tcm['codigo_fonte'].strip, modulo: orcamento)
					orgao = orcamento.orgaos.find_by(codigo: talao_de_receita_tcm['codigo_orgao'])
					natureza_da_receita = orcamento.naturezas_da_receita.find_by(codigo: talao_de_receita_tcm['codigo_rubrica'][0..9])
					unidade_orcamentaria = orcamento.unidades_orcamentarias.find_by(codigo: talao_de_receita_tcm['codigo_unidade'].strip, orgao_id: orgao.try(:id))
					unidade_orcamentaria_por_natureza_da_receita = ::Loa::UnidadeOrcamentariaPorNaturezaDaReceita.find_by(unidade_orcamentaria_id: unidade_orcamentaria.try(:id), natureza_da_receita_id: natureza_da_receita.try(:id))
					orcamento_da_receita = ::Loa::OrcamentoDaReceita.find_by( fonte_de_recursos_id: fonte_de_recursos.try(:id), unidade_orcamentaria_por_natureza_da_receita_id: unidade_orcamentaria_por_natureza_da_receita.try(:id) )

					orcamento_da_receita_id = orcamento_da_receita ? orcamento_da_receita.id : nil

					# conta bancaria
					conta_bancaria_por_unidade_orcamentaria_id = nil
					banco = Base::Banco.find_by(numero_do_banco: talao_de_receita_tcm['numero_banco'].to_i)
					if banco
						agencia = orcamento.agencias.find_by(banco_id: banco.id, numero_da_agencia: talao_de_receita_tcm['numero_agencia_bancaria'].strip)
						if agencia
							conta_bancaria = Base::ContaBancaria.find_by(numero_da_conta: talao_de_receita_tcm['numero_conta_corrente'], agencia_id: agencia.id)
							conta_bancaria_id = conta_bancaria.try(:id)
							if orcamento_da_receita_id && conta_bancaria_id
								conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find_by(unidade_orcamentaria: orcamento_da_receita.try(:unidade_orcamentaria_por_natureza_da_receita).try(:unidade_orcamentaria_id), conta_bancaria: conta_bancaria_id)
								if conta_bancaria_por_unidade_orcamentaria
									conta_bancaria_por_unidade_orcamentaria_id = conta_bancaria_por_unidade_orcamentaria.id
								end
							end
						end
					end

					# contribuinte
					pessoa_id = nil
					outra_pessoa = nil
					pessoa = Base::Pessoa.where("cpf = ? or cnpj = ?", talao_de_receita_tcm['numero_doc_contribuinte'].strip, talao_de_receita_tcm['numero_doc_contribuinte'].strip).first
					if pessoa
						pessoa_id = pessoa.id
					else
						pessoa = Base::Pessoa.new()
						pessoa.nome = talao_de_receita_tcm['nome_razao_social_contribuinte']
						if talao_de_receita_tcm['numero_doc_contribuinte'].strip.size == 11
							pessoa.tipo_de_pessoa = Base::TipoDePessoa.find_by(descricao: "Pessoa Física")
							pessoa.cpf = talao_de_receita_tcm['numero_doc_contribuinte'].strip
						elsif talao_de_receita_tcm['numero_doc_contribuinte'].strip.size == 14
							pessoa.tipo_de_pessoa = Base::TipoDePessoa.find_by(descricao: "Pessoa Jurídica")
							pessoa.cnpj = talao_de_receita_tcm['numero_doc_contribuinte'].strip
						else
							outra_pessoa = Base::Pessoa.where("nome = ?", talao_de_receita_tcm['nome_razao_social_contribuinte'].strip).first
						end

						if outra_pessoa
							pessoa_id = outra_pessoa.id
						else
							if pessoa.save(validate: false)
								pessoa_id = pessoa.id
							end
						end
					end

					# pesquisa tipo de documento
					tipo_de_documento = talao_de_receita_tcm['tipo_doc_credito']

					talao_de_receita = Contabilidade::TalaoDeReceita.new(
						orcamento_id: orcamento.id,
						orcamento_da_receita_id: orcamento_da_receita_id,
						numero_do_talao: talao_de_receita_tcm['numero_talao_receita'],
						data_do_talao: talao_de_receita_tcm['data_talao_receita'],
						valor: talao_de_receita_tcm['valor_receita'],
						historico: talao_de_receita_tcm['historico_receita'],
						pessoa_id: pessoa_id,
						conta_bancaria_por_unidade_orcamentaria_id: conta_bancaria_por_unidade_orcamentaria_id,
						#data_do_credito: talao_de_receita_tcm['dt_credito_tr'],
						documento_de_credito: talao_de_receita_tcm['numero_doc_credito'],
						tipo_de_documento: tipo_de_documento,
						origem_do_talao: 0 #orcamentario
					)

					talao_de_receita.save(validate: false)
					progress_bar.increment unless Rails.env == "test"
				end
			end

			def importar_dados_taloes_de_receita codigo_do_municipio, exercicio, mes
				response = HTTParty.get("#{@@host}/taloes_receitas.xml?codigo_municipio=#{codigo_do_municipio}&exercicio_orcamento=#{exercicio}00&data_referencia=#{exercicio}#{mes.digitos(2)}")
				begin
					dados_taloes_de_receitas = Hash.from_xml(response.body.encode(Encoding::UTF_8))['rsp']['taloes_receitas']
				rescue
					puts "Página não encontrada, tentando novamente..."
					sleep 5
					importar_dados_taloes_de_receita codigo_do_municipio, exercicio, mes
				end
			end
		end
	end
end
