require 'httparty'

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

		class << self
			def importar projeto, numero_do_contrato, exercicio, unidade_orcamentaria_id
				## ***IMPORTANTE***
				## todas as tabelas envolvidas na importação de um contrato do TCM, devem estar com arquivo_id = 0

				codigo_do_municipio = ::Configuracao.last.codigo_do_municipio_no_tcm
				raise Exception.new("Código do Município não configurado") if codigo_do_municipio.blank?
				orcamento = ::Orcamento.find_by_exercicio(exercicio)
				if orcamento.nil?
					# **IMPORTANTE** Caso não exista orçamento, será necessário importar antes. Basta apenas executar a linha
					# abaixo, entretanto foi comentado pois demorava a requisição do processo no browser. Para isso foi criado uma
					# task para ser executado => lib/tasks/importar_tcm.rake => task: importa_orcamento_e_despesa
					# ImportacaoTcm::LoaDespesa.importar(codigo_do_municipio, exercicio)
					raise Exception.new("Não existe o Orçamento criado para o exercício #{exercicio}. Contate a equipe de TI para realizarem a importação do Orçamento referente ao exercício informado.")
				end

				dados_do_contrato = importar_dados_do_contrato(codigo_do_municipio, numero_do_contrato, exercicio)
				dados_do_contratado = importar_dados_do_contratado(codigo_do_municipio, numero_do_contrato, exercicio)
				cria_contrato(projeto, dados_do_contrato, dados_do_contratado, orcamento, unidade_orcamentaria_id)
			end

			def importar_dados_do_contrato codigo_do_municipio, numero_do_contrato, exercicio
				response = HTTParty.get( "#{@@host}/contratos.xml?codigo_municipio=#{codigo_do_municipio}&data_contrato=#{exercicio}0101_#{exercicio}1231&numero_contrato=#{numero_do_contrato}" )
				begin
					dados_contrato = Hash.from_xml(response.body.encode(Encoding::UTF_8))['rsp']['contratos']
				rescue
					puts "Página não encontrada, tentando novamente..."
				end
			end

			def importar_dados_do_contratado codigo_do_municipio, numero_do_contrato, exercicio
				response = HTTParty.get( "#{@@host}/contratados.xml?codigo_municipio=#{codigo_do_municipio}&data_contrato=#{exercicio}0101_#{exercicio}1231&numero_contrato=#{numero_do_contrato}" )
				begin
					dados_dotacoes = Hash.from_xml(response.body.encode(Encoding::UTF_8))['rsp']['contratados']
				rescue
					puts "Página não encontrada, tentando novamente..."
				end
			end

			def cria_contrato projeto, dados_do_contrato, dados_do_contratado, orcamento, unidade_orcamentaria_id
				if dados_do_contrato.nil? || dados_do_contratado.nil?
					raise Exception.new("Não foi possível encontrar o contrato informado.")
				end

				dados_do_contrato_original = []
				if dados_do_contrato.kind_of?(Array)
					dados_do_contrato.each do |dado_do_contrato|
						dados_do_contrato_original = dado_do_contrato if dado_do_contrato['modalidade_contrato'] == "OR"
					end
				end
				dados_do_contrato = dados_do_contrato_original unless dados_do_contrato_original.blank?

				dados_do_contratado_original = []
				if dados_do_contratado.kind_of?(Array)
					dados_do_contratado.each do |dado_do_contratado|
						dados_do_contratado_original = dado_do_contratado if dado_do_contratado['numero_contrato'] == dados_do_contrato['numero_contrato']
					end
				end
				dados_do_contratado = dados_do_contratado_original unless dados_do_contratado_original.blank?

				if dados_do_contrato['modalidade_contrato'] == "OR"
					if dados_do_contratado['codigo_tipo_negociante'] == "1"
						pessoa_do_projeto = projeto.pessoas_do_projeto.joins(:pessoa).where(base_pessoas: {cnpj: dados_do_contratado['numero_documento_negociante']}).first
					else
						pessoa_do_projeto = projeto.pessoas_do_projeto.joins(:pessoa).where(base_pessoas: {cpf: dados_do_contratado['numero_documento_negociante']}).first
					end
					if pessoa_do_projeto.nil?
						raise Exception.new("O contratado não pertence aos licitantes do processo.")
					end

					unidade_orcamentaria_por_pedido = projeto.pedido.unidades_orcamentarias_por_pedido.find_by(unidade_orcamentaria_id: unidade_orcamentaria_id)

					tipo_de_contrato = dados_do_contrato['tipo_contrato'] == "O" ? 3 : 1

					contrato = ::Licitacao::Contrato.new(
						unidade_orcamentaria_por_pedido: unidade_orcamentaria_por_pedido,
						numero: dados_do_contrato['numero_contrato'],
						data_do_contrato: dados_do_contrato['data_contrato'].to_date,
						tipo_de_contrato: tipo_de_contrato,
						inicio_da_vigencia: dados_do_contrato['data_inicio_vigencia_contrato'].to_date,
						fim_da_vigencia: dados_do_contrato['data_fim_vigencia_contrato'].to_date,
						objeto: dados_do_contrato['descricao_objeto_contrato'],
						envia_pro_sim: false,
						arquivo_id: 0,
						projeto_id: projeto.id,
						orcamento: orcamento
					)
					contrato.build_contratado(pessoa_do_projeto: pessoa_do_projeto, arquivo_id: 0)
					contrato.save(validate: false)

					return contrato
				else
					raise Exception.new("Não será possível importar aditivos.")
				end
			end

		end
	end
end
