import time
from  generic.gn_request   import   Request # 
from  generic.gn_unicred    import   gn_unicred #
from datetime import datetime

import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class clicksign(gn_unicred):
    
    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.cod_env = '000'
        self.cod_doc = '000'
        self.cod_sig = '000'
        self.cod_relsig = '000'
        self.cod_notif = '000'
        
        self.rote_handler()
        
        ClientSecret        =   self.get_token_data('ClientSecret')
        
        environment = 'homolog' if self.environment_config.get('ambiente') == 'H' else ''
        
        urls   = self.get_url_environment(environment=environment)
        
        self.clicksign_request = Request(
                base_url = urls.get('base_url')
            ,   params   = {},
                verify= False,
                headers={
                    'Authorization': f"{ClientSecret}",
                    'Content-Type': 'application/vnd.api+json',
                    'Accept-Type': 'application/vnd.api+json'
                }
        )
         
        super(clicksign, self, ).__init__(argv)
        
        
        print('Fim')
        
    
    def get_url_environment(self, environment='homolog'):
        # PAREI AQUI
        base = f'{environment}'
        
        if environment == 'homolog':
            base = "sandbox."
        else:
            base = ""

        return {
            # "oAuth2"    :f"https://api.e-unicred.com.br{base}/oauth2/v2/grant-token",
            "base_url"  :f"https://{base}clicksign.com/api/v3/"
        }
    


    
    ######   ##  ##   ##  ##   ######   ##        ####    #####    ######    ####
    ##       ### ##   ##  ##   ##       ##       ##  ##   ##  ##   ##       ##
    #####    ######   ##  ##   #####    ##       ##  ##   ##  ##   #####     ####
    ##       ######   ##  ##   ##       ##       ##  ##   #####    ##           ##
    ##       ## ###    ####    ##       ##       ##  ##   ##       ##           ##
    ######   ##  ##     ##     ######   ######    ####    ##       ######    ####

     ####    #####    ######     ##     #####
    ##  ##   ##  ##     ##      ####    ##  ##
    ##       ##  ##     ##     ##  ##   ##  ##
    ##       #####      ##     ##  ##   #####
    ##  ##   ## ##      ##     ######   ## ##
     ####    ##  ##   ######   ##  ##   ##  ##

    
    def post_route_handler_envelopes(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()
        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)
            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    def handle_output_envelopes(self, data):
        import unidecode

        status_code = self.api_request.req.status_code
        responde_data = self.api_request.req.text
        structure = None

        if status_code == 201 or status_code == 200:

            dados = json.loads(responde_data)

            data = dados['data'] 
            attributes = dados['data']['attributes']
            relationships = dados['data']['relationships']


            structure = [
                "OK",
                "Criado com sucesso" if self.current_method == "POST" else "Atualizado com sucesso",
                data['id'],
                data['type'],
                data['links']['self'],
                #attributes['name'],
                attributes['status'],
                #attributes['deadline_at'],
                #attributes['locale'],
                #"S" if attributes['auto_close'] else "N",
                "S" if attributes['rubric_enabled'] else "N",
                #f"{attributes['remind_interval']}",
                #"S" if attributes['block_after_refusal'] else "N",
                #f"{attributes['default_subject']}",
                #f"{attributes['default_message']}",
                attributes['created'],
                attributes['modified'],
                "S" if  attributes['migrated'] else "N",
                relationships['folder']['links']['self'],
                relationships['folder']['links']['related'],
                relationships['documents']['links']['self'],
                relationships['documents']['links']['related'],
                relationships['signers']['links']['self'],
                relationships['signers']['links']['related'],
                relationships['requirements']['links']['self'],
                relationships['requirements']['links']['related']
            ]
        
        else:
            try:
                errors = json.loads(responde_data)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    unidecode.unidecode(error_message)
                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e)
                ]
            
        structure_txt = "|".join(structure)

        flag = "w+" if self.output_count == 0 else "a+"
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
        self.output_count += 1

    
    # ---------------------------------------------------------------------------------------------------
    # ---------------------------------------------------------------------------------------------------
    # ---------------------------------------------------------------------------------------------------
    
     ####     ####    ##  ##    ####    ##  ##   ##       ######     ##     #####
    ##  ##   ##  ##   ### ##   ##       ##  ##   ##         ##      ####    ##  ##
    ##       ##  ##   ######    ####    ##  ##   ##         ##     ##  ##   ##  ##
    ##       ##  ##   ######       ##   ##  ##   ##         ##     ##  ##   #####
    ##  ##   ##  ##   ## ###       ##   ##  ##   ##         ##     ######   ## ##
     ####     ####    ##  ##    ####    ######   ######     ##     ##  ##   ##  ##

    def get_envelopes_handler(self, dados):
        
        if dados == []:
            self.write_file("ER|Sem dados para consultar", self.saida_cobol , flag="w+", encoding='iso-8859-1')
        else:

            data = dados['data'] 
            attributes = dados['data']['attributes']
            relationships = dados['data']['relationships']

            structure = [
                "OK",
                "Criado com sucesso",
                data['id'],
                data['type'],
                data['links']['self'],
                attributes['name'],
                attributes['status'],
                attributes['deadline_at'],
                attributes['locale'],
                "S" if attributes['auto_close'] else "N",
                "S" if attributes['rubric_enabled'] else "N",
                f"{attributes['remind_interval']}",
                "S" if attributes['block_after_refusal'] else "N",
                f"{attributes['default_subject']}",
                f"{attributes['default_message']}",
                attributes['created'],
                attributes['modified'],
                "S" if  attributes['migrated'] else "N",
                relationships['folder']['links']['self'],
                relationships['folder']['links']['related'],
                relationships['documents']['links']['self'],
                relationships['documents']['links']['related'],
                relationships['signers']['links']['self'],
                relationships['signers']['links']['related'],
                relationships['requirements']['links']['self'],
                relationships['requirements']['links']['related']
            ]

            self.write_file("|".join(structure), self.saida_cobol , flag="w+", encoding='iso-8859-1')


    def format_rote_envelopes(self, rote):
        envelope_id = self.rote_data['path']['id']
        
        return "{}/{}".format(rote, envelope_id)
    
    # ---------------------------------------------------------------------------------------------------
    # ---------------------------------------------------------------------------------------------------
    # ---------------------------------------------------------------------------------------------------
    
      ##     ######   ##  ##     ##     ##       ######   ######     ##     #####
     ####      ##     ##  ##    ####    ##         ##        ##     ####    ##  ##
    ##  ##     ##     ##  ##   ##  ##   ##         ##       ##     ##  ##   ##  ##
    ##  ##     ##     ##  ##   ##  ##   ##         ##      ##      ##  ##   #####
    ######     ##     ##  ##   ######   ##         ##     ##       ######   ## ##
    ##  ##     ##     ######   ##  ##   ######   ######   ######   ##  ##   ##  ##

    def beforeSend_envelopes(self, dados):
        if self.current_method == "PATCH":
            self.current_rote = "{}/{}".format( self.current_rote, dados['data']['id'])

    def patch_route_handler_envelopes(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()

        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)
            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)

            self.handle_send(data_parsed)

            
    ####      ####     ####    ##  ##   ##   ##  ######   ##  ##   ######    ####     ####
    ## ##    ##  ##   ##  ##   ##  ##   ### ###  ##       ### ##     ##     ##  ##   ##
    ##  ##   ##  ##   ##       ##  ##   #######  #####    ######     ##     ##  ##    ####
    ##  ##   ##  ##   ##       ##  ##   ## # ##  ##       ######     ##     ##  ##       ##
    ## ##    ##  ##   ##  ##   ##  ##   ##   ##  ##       ## ###     ##     ##  ##       ##
    ####      ####     ####    ######   ##   ##  ######   ##  ##     ##      ####     ####

    def beforeSend_envelopes_envelope_id_documents(self, data):
        import os.path

        pathfile = data['data']['attributes']['content_base64']

        _, extension = os.path.splitext(pathfile)

        data['data']['attributes']['content_base64'] = self.file_to_base64(data['data']['attributes']['content_base64'])
        data['data']['attributes']['filename'] = f"{data['data']['attributes']['filename']}{extension}"


        
        return data

    # def format_rote_envelopes_envelope_id_documents(self, rote):
    #     path_params = self.rote_data.get('path')
    #     if path_params:
    #         return rote.format(**path_params)
        
    #     return None

    def post_route_handler_envelopes_envelope_id_documents(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()
        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)
            self.cod_env = data_parsed['cod_env']
            self.cod_doc = data_parsed['cod_doc']
            
            del data_parsed['cod_env']
            del data_parsed['cod_doc']
        
            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    def handle_output_envelopes_envelope_id_documents(self, data):
        status_code = self.api_request.req.status_code
        responde_data = self.api_request.req.text
        structure = None

        if status_code == 201 or status_code == 200:

            dados = json.loads(responde_data)

            data = dados['data'] 
            attributes = dados['data']['attributes']

            structure = [
                "OK",
                "Criado com sucesso",
                self.cod_env,
                self.cod_doc,
                data['id'],
                data['type'],
                data['links']['self'],
                data['links']['files']['original'],
                attributes['status'],
                attributes['filename'],
                attributes['template']['data'] if attributes['template']['data'] else "",
                "S" if attributes['migrated'] else "N",
                attributes['created'],
                attributes['modified'],
                "F"
            ]
        
        else:
            try:
                errors = json.loads(responde_data)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    error_message,
                   self.cod_env,
                   self.cod_doc,
                   "F"
                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e),
                   self.cod_env,
                   self.cod_doc,
                   "F"
                ]
            
        structure_txt = "|".join(structure)

        flag = "w+" if self.output_count == 0 else "a+"
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
        self.output_count += 1

    def put_route_handler_envelopes_envelope_id_documents(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()
        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)
            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    

     ####    ######    #####   ##  ##     ##     ######     ##     #####    ######    ####
    ##         ##     ##       ### ##    ####      ##      ####    ##  ##     ##     ##  ##
     ####      ##     ##       ######   ##  ##     ##     ##  ##   ##  ##     ##     ##  ##
        ##     ##     ## ###   ######   ##  ##     ##     ##  ##   #####      ##     ##  ##
        ##     ##     ##  ##   ## ###   ######     ##     ######   ## ##      ##     ##  ##
     ####    ######    #####   ##  ##   ##  ##     ##     ##  ##   ##  ##   ######    ####
    
    def post_route_handler_envelopes_envelope_id_signers(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()

        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)

            self.cod_env = data_parsed['cod_env']
            self.cod_sig = data_parsed['cod_sig']

            del data_parsed['cod_env']
            del data_parsed['cod_sig']

            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    def handle_output_envelopes_envelope_id_signers(self, data):
        status_code = self.api_request.req.status_code
        responde_data = self.api_request.req.text
        structure = None

        if status_code == 201 or status_code == 200:

            dados = json.loads(responde_data)

            data = dados['data'] 
            attributes = dados['data']['attributes']

            structure = [
                "OK",
                "Criado com sucesso",
                self.cod_env,
                self.cod_sig,
                data['id'],
                data['type'],
                data['links']['self'],
                "F"

                #attributes['name'],
                #attributes['birthday'],
                #attributes['email'],
                #attributes['phone_number'],
                #"S" if attributes['location_required_enabled'] else "N",
                #"S" if attributes['has_documentation'] else "N",
                #attributes['documentation'],
                #"S" if attributes['refusable'] else "N",
                #f"{attributes['group']}",
                #attributes['communicate_events']['document_signed'],
                #attributes['communicate_events']['signature_request'],
                #attributes['communicate_events']['signature_reminder'],
                #attributes['created'],
                #attributes['modified']
            ]
        
        else:
            try:
                errors = json.loads(responde_data)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    error_message,
                    self.cod_env,
                    self.cod_sig,
                    "F"

                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e),
                    self.cod_env,
                    self.cod_sig,
                    "F"

                ]
            
        structure_txt = "|".join(structure)

        flag = "w+" if self.output_count == 0 else "a+"
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
        self.output_count += 1

    
    
    
    #####    ######    ####    ##  ##   ######    ####    ######   ######    ####     ####
    ##  ##   ##       ##  ##   ##  ##     ##     ##         ##       ##     ##  ##   ##
    ##  ##   #####    ##  ##   ##  ##     ##      ####      ##       ##     ##  ##    ####
    #####    ##       ##  ##   ##  ##     ##         ##     ##       ##     ##  ##       ##
    ## ##    ##       ## ##    ##  ##     ##         ##     ##       ##     ##  ##       ##
    ##  ##   ######    ## ##   ######   ######    ####    ######     ##      ####     ####


    def post_route_handler_envelopes_envelope_id_requirements(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()
        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)

            self.cod_env = data_parsed['cod_env']
            self.cod_relsig = data_parsed['cod_relsig']

            del data_parsed['cod_env']
            del data_parsed['cod_relsig']

            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    def handle_output_envelopes_envelope_id_requirements(self, data):
        status_code = self.api_request.req.status_code
        responde_data = self.api_request.req.text
        structure = None

        if status_code == 201 or status_code == 200:

            dados = json.loads(responde_data)

            data = dados['data'] 
            attributes = dados['data']['attributes']
            
            # Agree
            try:
                structure = [
                    "OK",
                    "Criado com sucesso",
                    self.cod_env,
                    self.cod_relsig,
                    data['id'],
                    data['type'],
                    data['links']['self'],
                    attributes['action'],
                    attributes['role'],
                    attributes['created'],
                    attributes['modified'],
                    "F"
                ]
            except:
                pass

            # Provide evidence
            try:
                structure = [
                    "OK",
                    "Criado com sucesso",
                    self.cod_env,
                    self.cod_relsig,
                    data['id'],
                    data['type'],
                    data['links']['self'],
                    attributes['action'],
                    attributes['auth'],
                    attributes['created'],
                    attributes['modified'],
                    "F"
                ]
            except:
                pass

            # Rubricate
            try:
                structure = [
                    "OK",
                    "Criado com sucesso",
                    self.cod_env,
                    self.cod_relsig,
                    data['id'],
                    data['type'],
                    data['links']['self'],
                    attributes['action'],
                    attributes['pages'],
                    attributes['created'],
                    attributes['modified'],
                    "F"
                ]
            except:
                pass
        
        else:
            try:
                errors = json.loads(responde_data)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    error_message,
                    self.cod_env,
                    self.cod_relsig,
                    "F"

                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e),
                    self.cod_env,
                    self.cod_relsig,
                    "F"
                ]
            
        structure_txt = "|".join(structure)

        flag = "w+" if self.output_count == 0 else "a+"
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
        self.output_count += 1

    ##  ##    ####    ######   ######   ######   ######    ####      ##      ####      ##      ####
    ### ##   ##  ##     ##       ##     ##         ##     ##  ##    ####    ##  ##    ####    ##  ##
    ######   ##  ##     ##       ##     #####      ##     ##       ##  ##   ##       ##  ##   ##  ##
    ######   ##  ##     ##       ##     ##         ##     ##       ##  ##   ##       ##  ##   ##  ##
    ## ###   ##  ##     ##       ##     ##         ##     ##  ##   ######   ##  ##   ######   ##  ##
    ##  ##    ####      ##     ######   ##       ######    ####    ##  ##    ####    ##  ##    ####

    def post_route_handler_envelopes_envelope_id_notifications(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()
        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)

            self.cod_env = data_parsed['cod_env']
            self.cod_notif = data_parsed['cod_notif']

            del data_parsed['cod_env']
            del data_parsed['cod_notif']

            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    def handle_output_envelopes_envelope_id_notifications(self, data):
        status_code = self.api_request.req.status_code
        responde_data = self.api_request.req.text
        structure = None
        subitems = []

        if status_code == 201 or status_code == 200:

            dados = json.loads(responde_data)

            data = dados['data'] 
            attributes = dados['data']['attributes']
            structure = [
                "OK",
                "Criado com sucesso",
                "A",
                self.cod_env,
                self.cod_notif,
                data['id'],
                data['type'],
                attributes['message'],
                attributes['created'],
                "F"
            ]

            # Acessando a lista "summary"
            summary_list = data["attributes"]["summary"]


            # Percorrendo os itens da lista
            for item in summary_list:
                signer_id = item["signer_id"]
                notified = item["notified"]
                status_notify = "S" if notified else "N"

                subitems.append(f"OK|Criado com Sucesso|B|{self.cod_env}|{self.cod_notif}|{signer_id}|{status_notify}|F")

        else:
            try:
                errors = json.loads(responde_data)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    error_message,
                    "A",
                    self.cod_env,
                    self.cod_notif,
                    "F"

                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e),
                    "A",
                    self.cod_env,
                    self.cod_notif,
                    "F"
                ]
        
        structure_txt = "|".join(structure)
        tmp_strucuture = "\n".join(subitems)

        structure_txt = f"{structure_txt}\n{tmp_strucuture}"

        flag = "w+" if self.output_count == 0 else "a+"
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
        self.output_count += 1

    def post_route_handler_envelopes_envelope_id_signers_signer_id_notifications(self):
        #""" Rota de inclusao e alteracao de boleto tratamento de envio"""
        data = self.txt_to_dict()
        for request in data.get('C'):
            self.unparsed_data  = request
            request_structure   = self.atualWs.get('request')
            data_parsed  = self.parser(request, request_structure)

            self.cod_env = data_parsed['cod_env']
            self.cod_notif = data_parsed['cod_notif']

            del data_parsed['cod_env']
            del data_parsed['cod_notif']

            self.dados_requisicao = request
            #data_parsed  = self.parser(request, request_structure)
            self.handle_send(data_parsed)

    def handle_output_envelopes_envelope_id_signers_signer_id_notifications(self, data):
        status_code = self.api_request.req.status_code
        responde_data = self.api_request.req.text
        structure = None
        subitems = []

        if status_code == 201 or status_code == 200:

            dados = json.loads(responde_data)

            data = dados['data'] 
            attributes = dados['data']['attributes']
            
            structure = [
                "OK",
                "Criado com sucesso",
                "A",
                self.cod_env,
                self.cod_notif,
                data['id'],
                data['type'],
                attributes['message'],
                attributes['created'],
            ]


            # Acessando a lista "summary"
            summary_list = data["attributes"]["summary"]


            # Percorrendo os itens da lista
            for item in summary_list:
                signer_id = item["signer_id"]
                notified = item["notified"]
                status_notify = "S" if notified else "N"

                subitems.append(f"OK|Criado com sucesso|B|{signer_id}|{status_notify}")

        else:
            try:
                errors = json.loads(responde_data)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    error_message,
                    "A",
                    self.cod_env,
                    self.cod_notif,
                    "F"
                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e),
                    "A",
                    self.cod_env,
                    self.cod_notif,
                    "F"
                ]
        
        structure_txt = "|".join(structure)
        tmp_strucuture = "\n".join(subitems)

        structure_txt = f"{structure_txt}\n{tmp_strucuture}"

        flag = "w+" if self.output_count == 0 else "a+"
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
        self.output_count += 1

    ##   ##  ######   #####    ##  ##    ####     ####    ##  ##
    ##   ##  ##       ##  ##   ##  ##   ##  ##   ##  ##   ## ##
    ## # ##  #####    #####    ######   ##  ##   ##  ##   ####
    #######  ##       ##  ##   ##  ##   ##  ##   ##  ##   ####
    ### ###  ##       ##  ##   ##  ##   ##  ##   ##  ##   ## ##
    ##   ##  ######   #####    ##  ##    ####     ####    ##  ##

    def post_route_handler_webhooks(self):

        base_url = f"http://{self.softdib_ip}:{self.softdib_port}"

        self.btoken_request = Request(
            base_url = base_url,
            verify = False
        )

        token_request = self.btoken_request.doRequest(**{
            "rote":"/app/webhook/authentication/",
            "method": "POST",
            "json": {
                "user": "SAC",
                "pass": "01102022",
                "lkgp": self.nmlkgrupo,
                "banco": self.nmbanco
            }
        })


        if token_request.ok:
            token = token_request.text.replace('"', '')

            ClientSecret = self.get_token_data('ClientSecret')
            environment = 'homolog' if self.environment_config.get('ambiente') == 'H' else ''
            urls = self.get_url_environment(environment=environment)
            url = urls.get('base_url')
            url = url.replace('v3', 'v2')
        

            webhook_request = Request(
                base_url = url,
                verify = False,
                headers = {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'  # Corrigido de Accept-Type para Accept
                }
            )

            # Eventos a serem registrados
            endpoint = f"{self.rote_data['path']['urlWebhook']}/app/webhook/clicksign/?btoken={token}"

            try: 
                webhook = webhook_request.doRequest(**{
                    "rote": f"webhooks?access_token={ClientSecret}",
                    "method": "POST",
                    "json": {
                        "status": 'active',
                        "endpoint": endpoint,
                        "events": [
                            'add_signer',
                            'attempts_by_liveness_or_facematch_exceeded',
                            'attempts_by_whatsapp_exceeded',
                            'auto_close',
                            'biometric_refused',
                            'cancel',
                            'close',
                            'deadline',
                            'document_closed',
                            'facematch_refused',
                            'ocr_refused',
                            'refusal',
                            'remove_signer',
                            'sign',
                            'update_auto_close',
                            'update_deadline',
                            'update_locale',
                            'upload',
                            'documentscopy_refused',
                            'add_image',
                            'acceptance_term_enqueued',
                            'acceptance_term_sent',
                            'acceptance_term_completed',
                            'acceptance_term_refused',
                            'acceptance_term_canceled',
                            'acceptance_term_expired',
                            'acceptance_term_error'
                        ]
                    }
                })

                from unidecode import unidecode

                if webhook.ok: 
                    message_webhook = f"OK|Webhook criado com sucesso|{endpoint}"
                else:
                    errors = json.loads(webhook.text)

                    error_message = " | ".join(error["message"] for error in errors['errors'])

                    message_webhook = f"ER|Houve um erro ao criar o webhook - {unidecode(error_message)}"
                    
                flag = "w+" if self.output_count == 0 else "a+"
                self.write_file(message_webhook, self.saida_cobol , flag= flag, encoding='iso-8859-1' )
                self.output_count += 1
                    
            except Exception as e:
                    flag = "w+" if self.output_count == 0 else "a+"
                    self.write_file(f"ER|Houve um erro ao criar o webhook|{str(e)}", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
                    self.output_count += 1

        else:
            flag = "w+" if self.output_count == 0 else "a+"
            self.write_file(f"ER|{token_request.text}", self.saida_cobol , flag= flag, encoding='iso-8859-1' )
            self.output_count += 1

        


    ##########################################################

    def file_to_base64(self, path):
        import base64
        import mimetypes

        # Detecta o MIME type
        mime_type, _ = mimetypes.guess_type(path)
        if mime_type is None:
            mime_type = "application/octet-stream"  # Tipo genérico caso não detecte

        # Lê o arquivo e converte para Base64
        with open(path, "rb") as file:
            encoded_string = base64.b64encode(file.read()).decode("utf-8")

        # Retorna no formato `data:<MIME>;base64,<Base64>`
        return f"data:{mime_type};base64,{encoded_string}"


    def file_name(self, path):
        from pathlib import Path

        file_name = Path(path).name

        return file_name

    def convert_to_boolean(self, value):
        return True if value == "S" else False
    
    def convert_datetime(self, value):
        return value.replace(" ", "T")
    
    def format_cpf(self, cpf):
        # Remove qualquer caractere não numérico
        cpf_limpo = ''.join(filter(str.isdigit, cpf))
        
        # Verifica se o CPF possui 11 dígitos após a limpeza
        if len(cpf_limpo) == 11:
            return f"{cpf_limpo[:3]}.{cpf_limpo[3:6]}.{cpf_limpo[6:9]}-{cpf_limpo[9:]}"
        else:
            return cpf  # Retorna o CPF original se não for possível formatar
        
    def format_date(self, data):
        # Remove qualquer caractere não numérico
        data_limpa = ''.join(filter(str.isdigit, data))
        
        # Verifica se a data possui 8 dígitos após a limpeza (YYYYMMDD)
        if len(data_limpa) == 8:
            return f"{data_limpa[:4]}-{data_limpa[4:6]}-{data_limpa[6:]}"
        else:
            return data  # Retorna a data original se não for possível formatar
    
    """
    .########..########.##.......########.########.########
    .##.....##.##.......##.......##..........##....##......
    .##.....##.##.......##.......##..........##....##......
    .##.....##.######...##.......######......##....######..
    .##.....##.##.......##.......##..........##....##......
    .##.....##.##.......##.......##..........##....##......
    .########..########.########.########....##....########
    """
    def delete_handler(self) :
        
        if not self.hasAttr("deleteFromApi",self) :
            return
            
        self.deleteFromApi()
    
    def deleteFromApi(self):
        
        rote = self.atualWs.get('rote')

        delete_id = self.rote_data['path']['id']
        
        if "{envelope_id}" in rote:
           delete_envelope_id = self.rote_data['path']['envelope_id']  if self.rote_data['path']['envelope_id'] else ''
           rote  = rote.replace('{envelope_id}', delete_envelope_id)
        

        rote = f"{rote}/{delete_id}"

        delete_params = {
                "rote"   : rote
            ,   "method" : "DELETE"
            ,   "data"   : {}
        }
        
        delete_reponse = self.throttling(**delete_params)
        structure_txt = ""
        
        if not delete_reponse.ok:
            try:
                errors = json.loads(delete_reponse.text)

                error_message = " | ".join(error["detail"] for error in errors['errors'])

                structure = [
                    "ER",
                    error_message
                ]

            except Exception as e:
                structure = [
                    "ER",
                    str(e)
                ]
            
            structure_txt = "|".join(structure)
        else:
            structure_txt = "OK|Apagado com sucesso"
        
        self.write_file(f"{structure_txt}\n", self.saida_cobol , flag= 'w+', encoding='iso-8859-1')
        