import sys
import time
from  generic.gn_request   import   Request # 
from  generic.gn_repom    import   gn_repom #
from datetime import datetime

import json
import base64
import urllib3
import traceback

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class repom(gn_repom):
    
    def __init__(self, argv:list):
        self.response = None
        self.db = False
        self.output_count = 0
        self.suffix = "app_generic" 
        self.unparsed_data = {}
        self.setup(argv)
        self.repom_request = None
        
        self.rote_handler()
         
        super(repom, self, ).__init__(argv)
        
        
        print('Fim')


    def createRequest(self, model):
        client_id                   =   self.get_token_data('client_id')
        client_secret               =   self.get_token_data('client_secret')
        grant_type                  =   self.get_token_data('grant_type')

        usuario                     =   self.get_token_data('usuario')
        senha                       =   self.get_token_data('senha')
        
        environment = 'qa.' if self.environment_config.get('ambiente') == 'H' else 'www.'
                
        urls   = self.get_url_environment(model=model,ambiente=environment)
       
        if model == 'roteiros':
            auth = self.generateTokenRoteiros(urls.get('oAuth2'), client_id=client_id, client_secret=client_secret, grant_type=grant_type)
            if auth == "":
               exit(1)
            
            token = auth.get('access_token')
        else:
            auth = self.generateTokenViagem(urls.get('oAuth2'), usuario=usuario, senha=senha)
            token = auth.get('accessToken')
        
        self.api_request = Request(
                base_url = urls.get('base_url')
            ,   params   = {}
            ,   verify= False
            ,   headers={
                    'Authorization': f"Bearer {token}",
                    'content-type': 'application/json'
                }
        )
        
    
    def get_url_environment(self, model, ambiente):
        base_url_roteiro = "roteirizacao"

        if ambiente == 'qa.':
           base_url_roteiro = "roteirizacaoa"

        if model == 'roteiros':
            return {
                "oAuth2": f"https://{ambiente}repom.com.br/Repom.IdentityServer/connect/token",
                "base_url": f"https://{base_url_roteiro}.repom.com.br"
            }    
        else:
            return {
                "oAuth2": f"http://{ambiente}repom.com.br/Repom.ValePedagio.WebAPI/api/Token",
                "base_url": f"http://{ambiente}repom.com.br/Repom.ValePedagio.WebAPI"
            }
    
    def generateTokenRoteiros(self, url, client_id, client_secret, grant_type):

        payload = f"client_id={client_id}&client_secret={client_secret}&grant_type={grant_type}"
        headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
        }

        try:
            token = Request(
                method="POST",
                headers=headers, 
                data=payload
            ).doRequest(url=url)

            if not token.ok:
                self.createLog('APIERROR',f"ERRO ao criar token - Necessario criacao de novo token {token.text}")
                return ""

            return token.json()
        except Exception as e:
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                file.write(f"ER|Erro ao autenticar na API de Roteiros {str(e)} - URL {url}")

            sys.exit(1)
    
    def generateTokenViagem(self, url, usuario, senha):

        payload = json.dumps({
            "usuario": usuario,
            "senha": senha
        })

        headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
        }

        try:
            token = Request(
                method="POST",
                headers=headers, 
                data=payload
            ).doRequest(url=url)

            if not token.ok:
                self.createLog('APIERROR',f"ERRO ao criar token - Necessario criacao de novo token {token.text}")

            return token.json()
        except Exception as e:
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                file.write(f"ER|Erro ao autenticar na API de Viagem {str(e)} - URL {url}")
            
            sys.exit(1)




     #####  ######  ###    #    ######        ######  ####### ####### ####### ### ######  ####### 
    #     # #     #  #    # #   #     #       #     # #     #    #    #        #  #     # #     # 
    #       #     #  #   #   #  #     #       #     # #     #    #    #        #  #     # #     # 
    #       ######   #  #     # ######        ######  #     #    #    #####    #  ######  #     # 
    #       #   #    #  ####### #   #         #   #   #     #    #    #        #  #   #   #     # 
    #     # #    #   #  #     # #    #        #    #  #     #    #    #        #  #    #  #     # 
     #####  #     # ### #     # #     #       #     # #######    #    ####### ### #     # ####### 

    
    
    def post_route_handler_criar_roteiro(self):
        self.createRequest('roteiros')
        
        try:
            data = self.rote_data.get('path')
            data_roteiro = data['roteiro'].split('|')
            roteiro, idaVolta, origem, paradas, destino = data_roteiro


            origem_ibge, origem_uf = origem.lstrip().split('#')
            paradas_map = paradas.split(',')
            destino_ibge, destino_uf = destino.lstrip().split('#')

            paradas = []

            for key, parada in enumerate(paradas_map):
                if parada == '':
                    continue
                
                parada_ibge, parada_uf = parada.lstrip().split('#')

                paradas.append({
                    "codigoIBGE": parada_ibge,  
                    "estado": parada_uf  
                })
            

            template_roteiro = {
                "codigoRoteiroCliente": roteiro,
                "idaVolta": False if idaVolta == "N" else True,
                "origem": {
                    "codigoIBGE": origem_ibge,
                    "estado": origem_uf
                },
                "paradas": paradas,
                "destino": {
                    "codigoIBGE": destino_ibge,
                    "estado": destino_uf
                }
            }

            self.handle_send(data=template_roteiro)

        except ZeroDivisionError as error:
            print(traceback.format_exc())
            pass

        print("--TESTE--")

    
    def beforeSend_criar_roteiro(self, data):
        self.current_rote = "/Api/Rota"

    def handle_output_criar_roteiro(self, response):
        if response.ok:
            data = response.json()
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                file.write(f"OK||{data['codigoRoteiroExterno']}|{data['codigoRoteiroRepom']}|{data['codigoPercurso']}|{data['status']}|{data['descricaoErro']}")
        else:
            self.default_error(response, "Criar Roteiro")


                

     #####  ####### #     #  #####     #     #    #    #       ####### ######     ######  ####### ######     #     #####  ### ####### 
    #     # #     # ##    # #     #    #     #   # #   #       #     # #     #    #     # #       #     #   # #   #     #  #  #     # 
    #       #     # # #   # #          #     #  #   #  #       #     # #     #    #     # #       #     #  #   #  #        #  #     # 
    #       #     # #  #  #  #####     #     # #     # #       #     # ######     ######  #####   #     # #     # #  ####  #  #     # 
    #       #     # #   # #       #     #   #  ####### #       #     # #   #      #       #       #     # ####### #     #  #  #     # 
    #     # #     # #    ## #     #      # #   #     # #       #     # #    #     #       #       #     # #     # #     #  #  #     # 
     #####  ####### #     #  #####        #    #     # ####### ####### #     #    #       ####### ######  #     #  #####  ### ####### 



    def post_route_handler_consultar_valor_pedagio(self):
        self.createRequest('roteiros')
        
        try:
            data = self.rote_data.get('path')
            data_consulta = data['consulta'].split('|')
            codigoRoteiro, codigoPercurso, numeroEixos, numeroEixosSuspensosIda, numeroEixosSuspensosVolta = data_consulta

            template_consulta = {
                "CodigoRoteiro": codigoRoteiro , # Código Roteiro Repom
                "CodigoPercurso": codigoPercurso,  # Código Percurso Repom
                "NumeroEixos": numeroEixos, # Quantidade de eixos
                "NumeroEixosSuspensosIda": numeroEixosSuspensosIda, # Quantidade de Eixos suspenso IDA
                "NumeroEixosSuspensosVolta": numeroEixosSuspensosVolta # Quantidade de Eixos suspenso Volta
            }

            self.handle_send(data=template_consulta)
        except ZeroDivisionError as error:
            print(traceback.format_exc())
            pass

        print("--TESTE--")
        
    
    def beforeSend_consultar_valor_pedagio(self, data):
        self.current_rote = "/Api/Roteiro"

    def handle_output_consultar_valor_pedagio(self, response):
        if response.ok and response.status_code == 200:
            data = response.json()
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                file.write(f"OK||{data['valorTotalVpr']}|{data['valorVprIda']}|{data['valorVprVolta']}|{data['descricaoPercurso']}")
        else:
            self.default_error(response, "Consultar Valor Pedagio")
            




     #####  ####### #     #  #####  #     # #       #######    #       ######  ####### ####### ####### ### ######  ####### 
    #     # #     # ##    # #     # #     # #          #      # #      #     # #     #    #    #        #  #     # #     # 
    #       #     # # #   # #       #     # #          #     #   #     #     # #     #    #    #        #  #     # #     # 
    #       #     # #  #  #  #####  #     # #          #    #     #    ######  #     #    #    #####    #  ######  #     # 
    #       #     # #   # #       # #     # #          #    #######    #   #   #     #    #    #        #  #   #   #     # 
    #     # #     # #    ## #     # #     # #          #    #     #    #    #  #     #    #    #        #  #    #  #     # 
     #####  ####### #     #  #####   #####  #######    #    #     #    #     # #######    #    ####### ### #     # ####### 



    def consulta_roteiro_handler(self, data):
        self.createRequest('roteiros')

        data = self.rote_data.get('path')

        codigoRoteiro, codigoPercurso = data['consulta'].split("|")

        consulta_roteiro = self.api_request.doRequest(
            rote=f"/api/rota?codigoRoteiro={codigoRoteiro}&codigoPercurso={codigoPercurso}",
            method="GET"
        )
        
        if consulta_roteiro.ok and consulta_roteiro.status_code == 200:

            roteiro_data = consulta_roteiro.json()
            roteiro = roteiro_data['roteiro']
            paradas = roteiro_data['paradas']
            
            lineA = f"OK||A|{roteiro['percursoCodigo']}|{roteiro['roteiroCodigo']}|{roteiro['cidadeOrigem']}|{roteiro['estadoOrigem']}|{roteiro['cidadeDestino']}|{roteiro['estadoDestino']}|{roteiro['percursoCodigoCliente']}|{roteiro['sentido']}|{roteiro['percursoDescricao']}|{roteiro['percursoTipoDescricao']}\n"
            lineB = ""

            for keyParada, valueParada in enumerate(paradas):
                lineB += f"OK||B|{valueParada['indice']}|{valueParada['cidadeNome']}|{valueParada['estadoNome']}\n"
            
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                file.write(f"{lineA}{lineB}")
        else:
            try:
                if consulta_roteiro.status_code != 204:
                    retorno = consulta_roteiro.json()
                    msg_erro = retorno["errors"][0]["descricao"] 
                else:
                    msg_erro = "Sem retorno da requisicao" 

                
                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    #file.write(f"ER|{response.text}")
                    file.write(f"ER|{msg_erro}")
            except Exception as e:
                headers_str = "; ".join(f"{key}: {value}" for key, value in consulta_roteiro.headers.items())

                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    file.write(f"ER|Consulta Roteiro: {str(e)}; Resposta {consulta_roteiro.text} ; Status {consulta_roteiro.status_code} ; Headers {headers_str}")


        return data
    


    ####### #     # ###  #####   #####     #    #######    #     # ######  ####### 
    #       ##   ##  #  #     # #     #   # #   #     #    #     # #     # #     # 
    #       # # # #  #  #       #        #   #  #     #    #     # #     # #     # 
    #####   #  #  #  #   #####   #####  #     # #     #    #     # ######  #     # 
    #       #     #  #        #       # ####### #     #     #   #  #       #     # 
    #       #     #  #  #     # #     # #     # #     #      # #   #       #     # 
    ####### #     # ###  #####   #####  #     # #######       #    #       ####### 

    

    def post_route_handler_emissao_vale_pedagio(self):
        self.createRequest('vale_pedagio')
        
        try:
            data = self.rote_data.get('path')
            data_emissao = data['emissao'].split('|')
            
            processoCodigoCliente, placa, numeroEixos, carretaPlaca, carretaNumeroEixos, nomeTransportador, documentoTransportador, nomeMotorista, documentoMotorista, cnpjFilial, usuarioEmissao, roteiroCodigo, percursoCodigo, documentoCodigo, serie, pracas, eixosSuspensosIda, eixosSuspensosVolta, utilizaCarreta, subContratado,docSubContratado = data_emissao

            # Se for usar multiplos documentos  ativar a linha de baixo e nos parametros de entrada remova o pipe da serie

            # processoCodigoCliente, placa, numeroEixos, carretaPlaca, carretaNumeroEixos, nomeTransportador, documentoTransportador, nomeMotorista, documentoMotorista, cnpjFilial, usuarioEmissao, roteiroCodigo, percursoCodigo, documentos, pracas, eixosSuspensosIda, eixosSuspensosVolta, utilizaCarreta = data_emissao

            # documentos_data = documentos.split(',')
            # documento = []

            # for key, documento_item in enumerate(documentos_data):
            #     item_codigo, item_serie = documento_item.split('#')

            #     documento.append({
            #         "documentoCodigo": item_codigo,  
            #         "estado": item_serie  
            #     })

            # e no template, sete documento como a variavel acima *documento

            pracas = pracas.split(',')

            if pracas[0] == '':
                pracas = []

            template = {
                "ProcessoCodigoCliente": processoCodigoCliente, # //Identificador da Viagem no ERP/TMS 
                "Placa": placa, # PLaca do Veículo de Tração
                "NumeroEixos": numeroEixos, # Quantiade Eixos Cavalo
                "CarretaPlaca": carretaPlaca, # Placa da Carreta, s enão tiver mandar o vazio. Caso aja mais de uma carreta, informar a última placa
                "CarretaNumeroEixos": carretaNumeroEixos, # Quantiade Eixos Carreta, se naõ houver enviar com valor vazio. Caso aja mais de uma carreta enviar a soma de eixos das carretas
                "NomeTransportador": nomeTransportador, # / NOme TRansportador
                "DocumentoTransportador": documentoTransportador, #  Documento Transportador
                "NomeMotorista": nomeMotorista, # Motorista 
                "DocumentoMotorista": documentoMotorista, # Documento Motorista
                "CnpjFilial": cnpjFilial, # CNPJ da Filial de emissão do VPO
                "UsuarioEmissao": usuarioEmissao, # Usuario de emissão do VPO
                # Dados do Roteiro, caso não informado é necessário enviar o a id das praças no objeto "Pracas"
                "Roteiro": {
                    "RoteiroCodigo": roteiroCodigo, # Código Roteiro Repom
                    "PercursoCodigo": percursoCodigo # Código Percurso Repom
                },
                "documento": [ 
                    {
                        "documentoCodigo": documentoCodigo, # Número do documento
                        "serie": serie # Sério do documento
                    }
                ],
                # Quando enviar o roteiro no objeto "Roteiro", o objeto "Pracas" deve ser enviado com o array vazio
                "Pracas": pracas,
                "Configuracao": {
                    "EixosSuspensosIda": eixosSuspensosIda, # Quantidade de eixo suspenso na IDA
                    "EixosSuspensosVolta": eixosSuspensosVolta # Quantidade de eixo suspenso na Volta 
                },
                "UtilizaCarreta": True if utilizaCarreta == "S" else False,
                #"SubContratado" : subContratado,
                "documentoSubcontratado" : docSubContratado
            }

            self.handle_send(data=template)
        except ZeroDivisionError as error:
            print(traceback.format_exc())
            pass
        
    
    def beforeSend_emissao_vale_pedagio(self, data):
        self.current_rote = "/api/RepomViagem/ValePedagio"

    def handle_output_emissao_vale_pedagio(self, response):
        if response.ok and response.status_code == 200:

            try:
                dados = response.json()

                if dados['result']['status'] == False:
                    with open(self.saida_cobol, "w", encoding="utf-8") as file:
                        file.write(f"ER|{dados['result']['descricao']}")
                        return
                #print(dados)
                
                
                lineA = f"OK||A|{dados['numeroEixosCavalo']}|{dados['clienteCNPJ']}|{dados['transportadorCPFCNPJ']}|{dados['motoristaCPF']}|{dados['dataEmissao']}|{dados['razaoSocialCliente']}|{dados['statusCarga']}|{dados['viagemAtiva']}|{dados['codigoViagem']}|{dados['codigoViagemRepom']}|{dados['veiculo']}|{dados['tipoEmissao']}|{dados['valor']}|{dados['tag']}|{dados['dataCancelamento']}|{dados['usuarioCancelamento']}|{dados['dataCarga']}|{dados['dataDescarga']}|{dados['usuarioDescarga']}|{dados['idvpoAntt'][0]}\n"
                lineB = ""
                lineC = ""

                for keyPraca, valuePraca in enumerate(dados['pracas']):
                        lineB += f"OK||B|{valuePraca['nomeConcessionaria']}|{valuePraca['concessionariaCodigo']}|{valuePraca['nomePraca']}|{valuePraca['nomeRodovia']}|{valuePraca['ativa']}|\n"
                        for keyPreco, valuePreco in enumerate(valuePraca['pracaPreco']):
                            lineC += f"OK||C|{valuePraca['concessionariaCodigo']}|{valuePraca['nomePraca']}|{valuePreco['preco']}|{valuePreco['quantidadeEixos']}\n"
                    
                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    file.write(f"{lineA}{lineB}{lineC}")

            except ZeroDivisionError as error:
                print(traceback.format_exc())
        else:
            self.default_error(response, "Emissao Vale Pedagio")
            # data = response.json()
            # with open(self.saida_cobol, "w", encoding="utf-8") as file:
            #     file.write(f"{data['valorTotalVpr']}|{data['valorVprIda']}|{data['valorVprVolta']}|{data['descricaoPercurso']}")



     #####     #    #     #  #####  ####### #          #    ######     #     # ######  ####### 
    #     #   # #   ##    # #     # #       #         # #   #     #    #     # #     # #     # 
    #        #   #  # #   # #       #       #        #   #  #     #    #     # #     # #     # 
    #       #     # #  #  # #       #####   #       #     # ######     #     # ######  #     # 
    #       ####### #   # # #       #       #       ####### #   #       #   #  #       #     # 
    #     # #     # #    ## #     # #       #       #     # #    #       # #   #       #     # 
     #####  #     # #     #  #####  ####### ####### #     # #     #       #    #       ####### 


    def post_route_handler_cancelar_vale_pedagio(self):
        self.createRequest('vale_pedagio')
        
        try:
            data = self.rote_data.get('path')
            cancelar = data['cancelar'].split('|')
            
            viagemID, usuario = cancelar

            template_cancelar = {
                "viagemCodigo": viagemID,
                "usuario": usuario
            }

            self.handle_send(data=template_cancelar)
        except ZeroDivisionError as error:
            print(traceback.format_exc())
            pass
        

    def beforeSend_cancelar_vale_pedagio(self, data):
        self.current_rote = "/api/RepomViagem/CancelaViagem"

    def handle_output_cancelar_vale_pedagio(self, response):
        if response.ok and response.status_code == 200:

            try:
                dados = response.json()

                if dados['result']['status'] == False:
                    with open(self.saida_cobol, "w", encoding="utf-8") as file:
                        file.write(f"ER|{dados['result']['descricao']}")
                        return

                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    file.write(f"OK|Cancelado")
                    return

            except ZeroDivisionError as error:
                print(traceback.format_exc())
                pass

        else:
            self.default_error(response, "Cancelar Vale Pedagio")


    def default_error(self, response, mensagem_error):
        try:
            retorno = response.json()
            msg_erro = retorno["errors"][0]["descricao"] 
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                #file.write(f"ER|{response.text}")
                file.write(f"ER|{msg_erro}")
        except Exception as e:
            with open(self.saida_cobol, "w", encoding="utf-8") as file:
                headers_str = "; ".join(f"{key}: {value}" for key, value in response.headers.items())

                file.write(f"ER|{mensagem_error}: {str(e)}; Resposta {response.text} ; Status {response.status_code} ; Headers {headers_str}")



       #    #       ####### ####### ######     #    ######     #     # ######  ####### 
      # #   #          #    #       #     #   # #   #     #    #     # #     # #     # 
     #   #  #          #    #       #     #  #   #  #     #    #     # #     # #     # 
    #     # #          #    #####   ######  #     # ######     #     # ######  #     # 
    ####### #          #    #       #   #   ####### #   #       #   #  #       #     # 
    #     # #          #    #       #    #  #     # #    #       # #   #       #     # 
    #     # #######    #    ####### #     # #     # #     #       #    #       ####### 

    def put_route_handler_altera_vale_pedagio(self):
        self.createRequest('vale_pedagio')
        
        try:
            data = self.rote_data.get('path')
            data_emissao = data['alteracao'].split('|')
            
            viagemID, placa, obs = data_emissao

            template_alterar = {
                "codigoViagem": viagemID,
                "veiculo": placa,
                "observacao": obs
            }

            self.handle_send(data=template_alterar)
        except ZeroDivisionError as error:
            print(traceback.format_exc())
            pass
        

    def beforeSend_altera_vale_pedagio(self, data):
        self.current_rote = "/api/RepomViagem/Veiculo"

    def handle_output_altera_vale_pedagio(self, response):
        if response.ok and response.status_code == 200:
            
            try:
                dados = response.json()

                if dados['result']['status'] == False:
                    with open(self.saida_cobol, "w", encoding="utf-8") as file:
                        file.write(f"ER|{dados['result']['descricao']}")
                        return
                    
                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    file.write(f"OK|Alterado")
                    return
                
            except ZeroDivisionError as error:
                print(traceback.format_exc())
                pass    
        
        else:
            self.default_error(response, "Alterar Vale Pedagio")





     #####  ####### #     #  #####  #     # #       #######    #       #     # ######  ####### 
    #     # #     # ##    # #     # #     # #          #      # #      #     # #     # #     # 
    #       #     # # #   # #       #     # #          #     #   #     #     # #     # #     # 
    #       #     # #  #  #  #####  #     # #          #    #     #    #     # ######  #     # 
    #       #     # #   # #       # #     # #          #    #######     #   #  #       #     # 
    #     # #     # #    ## #     # #     # #          #    #     #      # #   #       #     # 
     #####  ####### #     #  #####   #####  #######    #    #     #       #    #       ####### 


    def consulta_vale_pedagio_handler(self, data):
        self.createRequest('vale_pedagio')

        data = self.rote_data.get('path')

        viagemId = data['viagem_id']

        consulta = self.api_request.doRequest(
            rote=f"/api/RepomViagem/ID?ID={viagemId}",
            method="GET"
        )
        
        if consulta.ok and consulta.status_code == 200:
            
            try:
                dados = consulta.json()

                if dados['result']['status'] == False:
                    with open(self.saida_cobol, "w", encoding="utf-8") as file:
                        file.write(f"ER|{dados['result']['descricao']}")
                        return

                lineA = f"OK||A|{dados['numeroEixosCavalo']}|{dados['clienteCNPJ']}|{dados['transportadorCPFCNPJ']}|{dados['motoristaCPF']}|{dados['dataEmissao']}|{dados['razaoSocialCliente']}|{dados['statusCarga']}|{dados['viagemAtiva']}|{dados['codigoViagem']}|{dados['codigoViagemRepom']}|{dados['veiculo']}|{dados['tipoEmissao']}|{dados['valor']}|{dados['tag']}|{dados['dataCancelamento']}|{dados['usuarioCancelamento']}|{dados['dataCarga']}|{dados['dataDescarga']}|{dados['usuarioDescarga']}|{dados['idVpoAntt'][0]}\n"
                lineB = ""
                lineC = ""

                for keyPraca, valuePraca in enumerate(dados['pracas']):
                        lineB += f"OK||B|{valuePraca['nomeConcessionaria']}|{valuePraca['concessionariaCodigo']}|{valuePraca['nomePraca']}|{valuePraca['nomeRodovia']}|{valuePraca['ativa']}|\n"
                        for keyPreco, valuePreco in enumerate(valuePraca['pracaPreco']):
                            lineC += f"OK||C|{valuePraca['concessionariaCodigo']}|{valuePraca['nomePraca']}|{valuePreco['preco']}|{valuePreco['quantidadeEixos']}\n"
                    
                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    file.write(f"{lineA}{lineB}{lineC}")

            except ZeroDivisionError as error:
                print(traceback.format_exc())

        else:
            self.default_error(consulta, "Consulta Vale Pedagio")

        return data
    
    
     #####  ####### #     #  #####  #     # #       #######    #       #######    #     #####  
    #     # #     # ##    # #     # #     # #          #      # #         #      # #   #     # 
    #       #     # # #   # #       #     # #          #     #   #        #     #   #  #       
    #       #     # #  #  #  #####  #     # #          #    #     #       #    #     # #  #### 
    #       #     # #   # #       # #     # #          #    #######       #    ####### #     # 
    #     # #     # #    ## #     # #     # #          #    #     #       #    #     # #     # 
     #####  ####### #     #  #####   #####  #######    #    #     #       #    #     #  #####  

    
    def consulta_tag_handler(self, data):
        self.createRequest('vale_pedagio')

        data = self.rote_data.get('path')

        placa = data['placa']

        consulta = self.api_request.doRequest(
            rote=f"/api/RepomVeiculo/Placa?Placa={placa}",
            method="GET"
        )
        
        if consulta.ok and consulta.status_code == 200:
            
            try:
                dados = consulta.json()

                if dados['result']['status'] == False:
                    with open(self.saida_cobol, "w", encoding="utf-8") as file:
                        file.write(f"ER|{dados['result']['descricao']}")
                        return

                lineA = f"OK||A|{dados['placa']}|{dados['dataCadastro']}|{dados['categoriaEixo']}|{dados['emissorPedagioEletronicoID']}\n"
                lineB = ""

                for keyTAG, valueTAG in enumerate(dados['tag']):
                        lineB += f"OK||B|{valueTAG['serial']}|{valueTAG['statusTAG']}|{valueTAG['tipoEmissor']}|{valueTAG['statusVinculoVeiculoTAG']}\n"
                    
                with open(self.saida_cobol, "w", encoding="utf-8") as file:
                    file.write(f"{lineA}{lineB}")

            except ZeroDivisionError as error:
                print(traceback.format_exc())

        else:
            self.default_error(consulta, "Consulta Tag")

        return data

    ######   ##  ##   ######   #####      ##      ####
    ##       ##  ##     ##     ##  ##    ####    ##  ##
    ##         ###      ##     ##  ##   ##  ##   ##
    ####       ##       ##     #####    ######    ####
    ##        ####      ##     ####     ##  ##       ##
    ##       ##  ##     ##     ## ##    ##  ##   ##  ##
    ######   ##  ##     ##     ##  ##   ##  ##    ####

    def response_code_200(self, response):
        print(response)
        return 

    def handle_response(self, response):
        return self.handle_output(response)
    
    def custom_flag_status(self, value, key):
        return "OK" if not value else "ER"
    
    def convert_to_boolean(self, value):
        return True if value == "S" else False
    
    def convert_json_string_to_xml(self, json_string):
        """Converte uma string JSON para uma string XML."""
        # Carregar a string JSON como um dicionário
        json_data = json.loads(json_string)

        # Converter JSON para XML
        xml_data = self.json_to_xml(json_data)

        # Adicionar cabeçalho XML
        xml_data = f'<?xml version="1.0" encoding="UTF-8"?>\n<root>\n{xml_data}\n</root>'
        
        return xml_data

    def json_to_xml(self, json_obj, line_padding=""):
        """Converte um dicionário JSON em uma string XML."""
        result_list = []

        for key, value in json_obj.items():
            if isinstance(value, dict):
                result_list.append(f"{line_padding}<{key}>\n{self.json_to_xml(value, line_padding + '  ')}\n{line_padding}</{key}>")
            elif isinstance(value, list):
                for item in value:
                    result_list.append(f"{line_padding}<{key}>\n{self.json_to_xml(item, line_padding + '  ')}\n{line_padding}</{key}>")
            else:
                result_list.append(f"{line_padding}<{key}>{value}</{key}>")

        return "\n".join(result_list)
    
    # Desativando pois não é uma rota de pedidos
    def define_sd_request(self,rota='/integracao/pedido/authentication'):
        return
    
    
    #####      ##      ####     ####    ##  ##     ##     ######    ####     ####    ##  ##            #####    ##  ##   ##       ######    ####
    ##  ##    ####    ##  ##     ##     ### ##    ####      ##       ##     ##  ##   ### ##            ##  ##   ##  ##   ##       ##       ##  ##
    ##  ##   ##  ##   ##         ##     ######   ##  ##     ##       ##     ##  ##   ######            ##  ##   ##  ##   ##       ##       ##
    #####    ######   ## ###     ##     ######   ######     ##       ##     ##  ##   ######            #####    ##  ##   ##       ####      ####
    ##       ##  ##   ##  ##     ##     ## ###   ##  ##     ##       ##     ##  ##   ## ###            ####     ##  ##   ##       ##           ##
    ##       ##  ##   ##  ##     ##     ##  ##   ##  ##     ##       ##     ##  ##   ##  ##            ## ##    ##  ##   ##       ##       ##  ##
    ##       ##  ##    ####     ####    ##  ##   ##  ##     ##      ####     ####    ##  ##            ##  ##    ####    ######   ######    ####

    def pagination(self, rote) :
        return

    
    def pagination_rules(self, response, data):
        #'pedidos/?status=2&alterado_apos=2021-07-12 15:41:29'
        if response.ok:
            body = self.tryJson(response)
            if body.get('indicadorContinuidade') == 'S':
                query = self.rote_data.get('query')
                query['indice'] = body.get('proximoIndice')
                params = self.mountRouteParams(query)
                return f"boletos?{params}"
            return None
        return None
    
    
        
