require 'httparty'

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

				dados_contas_bancarias = importar_dados_contas_bancarias(codigo_do_municipio, exercicio)
				criar_contas_bancarias(dados_contas_bancarias, orcamento)
			end

			def criar_contas_bancarias dados_contas_bancarias, orcamento
				progress_bar = ImportacaoTcm::Loa.barra_de_progresso( titulo: 'CONTAS BANCÁRIAS', total: dados_contas_bancarias.size ) unless Rails.env == "test"
				dados_contas_bancarias.each do |conta_bancaria_tcm|
					# cria agencia bancária
					agencia = orcamento.agencias.find_by( numero_da_agencia: conta_bancaria_tcm['numero_agencia'] )
					if agencia.nil?
						banco = Base::Banco.find_by(numero_do_banco: conta_bancaria_tcm['numero_banco'].to_i)
						if banco
							agencia = Base::Agencia.new(nome: conta_bancaria_tcm['numero_agencia'], numero_da_agencia: conta_bancaria_tcm['numero_agencia'], banco_id: banco.id, orcamento_id: orcamento.id)
							agencia.save(validate: false, skip_callbacks: true)
						end
					end
					if agencia.present?
						conta = Base::ContaBancaria.find_by(agencia_id: agencia.try(:id), numero_da_conta: conta_bancaria_tcm['numero_conta'])
						if conta.nil?
							conta = Base::ContaBancaria.new(agencia_id: agencia.id, numero_da_conta: conta_bancaria_tcm['numero_conta'], data_de_abertura: conta_bancaria_tcm['data_abertura'], tipo_de_conta_bancaria_id: conta_bancaria_tcm['tipo_conta'], funcao_id: conta_bancaria_tcm['codigo_funcao'], descricao_do_vinculo: conta_bancaria_tcm['descricao_objetivo'], saldo_inicial: conta_bancaria_tcm['valor_saldo_abertura'])
							conta.save(validate: false, skip_callbacks: true)

							# Gera registro na tabela de unidades orcamentarias por conta
							orgao = ::Loa::Orgao.find_by(codigo: conta_bancaria_tcm['codigo_orgao'])
							if orgao
								# pesquisa unidade orcamentaria
								unidade_orcamentaria = ::Loa::UnidadeOrcamentaria.find_by(codigo: conta_bancaria_tcm['codigo_unidade'].strip, orgao_id: orgao.id)
								if unidade_orcamentaria
									# pesquisa se ja existe a unidade orcamentaria nessa conta bancaria
									conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find_by(conta_bancaria_id: conta.id, unidade_orcamentaria_id: unidade_orcamentaria.id)
									if conta_bancaria_por_unidade_orcamentaria.nil?
										conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.new(conta_bancaria_id: conta.id, unidade_orcamentaria_id: unidade_orcamentaria.id)
										conta_bancaria_por_unidade_orcamentaria.save(validate: false, skip_callbacks: true)
									end
								end
							end
						else
							# Gera registro na tabela de unidades orcamentarias por conta
							orgao = ::Loa::Orgao.find_by(codigo: conta_bancaria_tcm['codigo_orgao'])
							if orgao
								# pesquisa unidade orcamentaria
								unidade_orcamentaria = ::Loa::UnidadeOrcamentaria.find_by(codigo: conta_bancaria_tcm['codigo_unidade'].strip, orgao_id: orgao.id)
								if unidade_orcamentaria
									# pesquisa se ja existe a unidade orcamentaria nessa conta bancaria
									conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find_by(conta_bancaria_id: conta.id, unidade_orcamentaria_id: unidade_orcamentaria.id)
									if conta_bancaria_por_unidade_orcamentaria.nil?
										conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.new(conta_bancaria_id: conta.id, unidade_orcamentaria_id: unidade_orcamentaria.id)
										conta_bancaria_por_unidade_orcamentaria.save(validate: false, skip_callbacks: true)
									end
								end
							end
						end
					end
					progress_bar.increment unless Rails.env == "test"
				end
			end

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