import base64
from   generic.gn_request   import   Request # 
from   lojainteg.lojainteg       import   lojainteg # 
from  datetime              import datetime, timedelta
import traceback, json

class forseti(lojainteg):
    def __init__(self, argv:list):
        super(forseti, self, ).__init__(argv)

    def pedidos_handler(self, data) :
        
        for order in data:

            code = self.jsonValueByPath(self.atualWs.get('identifier','id'),order)
            
            order_already_exists = self.exists(
                    "IDTBPEDIDOSRETORNO"
                ,   "TBPEDIDOSRETORNO"
                ,   [ 
                        f"CDPEDIDOEXTERNO='{code}'"#.format(order[self.atualWs['identifier']])
                    ,   f"NMAPI='{self.apiName}'"#.format(self.apiName)
                ]
            
            )
            
            if order_already_exists:
                continue
            
            order_to_send   = dict()
            
            try:
                self.current_order = order
                # Ira extrair dodos os dados referente a pedidos e aos items
                # Ele extrai os valores relacionado ao que foi definido no map
                order_to_send['pedido'       ]  = self.call("get_order_data" , self.current_order, is_required = True) #[ self.extractValues(order, 'pedido_fields') ]

                status, tid, nsu = self.status_paid(self.current_order)

                if status == 'paid':
                   # metodo_pagamento = self.jsonValueByPath("pagamentos/0/forma_pagamento/codigo", self.current_order)
                    order_to_send['pedido'][0]['NSU'] = nsu
                    order_to_send['pedido'][0]['TID'] = tid

                # Existe um tratamento no Ideris, que se o pedido for Mercado Livre e o tipo for igual a FULL ele não irá importar o pedido
                if order_to_send['pedido'       ][0]['CDFRETE'] == 0:
                    continue
            
                order_to_send['itenscarrinho']  = self.call("get_order_items", self.current_order, is_required = True) 
                order_to_send['volumes']        = self.call("get_order_volumes", self.current_order, is_required = False) 
                order_to_send['etiquetas']      = self.call("get_order_etiquetas", self.current_order, is_required = False) 
                
                #continue 
                # funcao para verificar se o codigo do cliente existe no sistema softdib
                if len( order_to_send['pedido'] ) and ( not order_to_send['pedido'][0]['CDCLIENTE']  or self.atualWs.get('alwaysUpdateClient')):
                    
                    cli_data, = order_to_send['pedido']
                    #cli_data['IDCLIENTEEXTERNO'] = ''
                    #if self.hasAttr("customer_data", self) :
                        # Funcao para recuperar os dados do cliente caso nao venha os dados completo para cadastro e recuperar id do cliente
                        #data = getattr(self, "customer_data")( data )
                    #else :
                    customer_data = self.call('customer_data', cli_data)
                    order_to_send['pedido'][0]['CDCLIENTE'] = self.salvar_cliente_softdib(customer_data or cli_data)
                    
                self.salvar_pedido_softdib(order_to_send)
                    
            except ZeroDivisionError:
                print(traceback.format_exc())        
            # except Exception as error:
            #     self.createLog("999", str(error))
            #     continue
                #print(error)
                
            
            
            # Limpa a variavel
            self.current_order = {}
    
    def status_paid(self, order):

        pagarme = None
        auth = None
        token = self.get_token_data('KEY_PAG')

        secretKey = f"{token}:"
        
        auth = base64.b64encode(secretKey.encode()).decode()

        pagarme = Request(
            base_url="https://api.pagar.me/core/v5/charges",
            headers={
                'Authorization': f'Basic {auth}'
            }
        )

        req = pagarme.doRequest(
            rote="/?code={}".format(order['numero'])
        )

        if req.status_code == 200:
            response = json.loads(req.text)

            self.pagarme_current_order = response

            pagos = [item for item in response['data'] if item.get('status') == "paid"]

            if len(pagos) == 0:
                return 'not_paid', '', ''
            
            ultimo_pago = pagos[-1]

            if ultimo_pago.get('payment_method') == "pix":
                try:
                    return ultimo_pago['status'], ultimo_pago['last_transaction']['pix_provider_tid'], ""
                except:
                    return ultimo_pago['status'], "", ""

            try:
                acquirer_tid = ultimo_pago['last_transaction']['acquirer_tid']
            except:
                acquirer_tid = ''

            try:
                acquirer_nsu = ultimo_pago['last_transaction']['acquirer_nsu']
            except:
                acquirer_nsu = ''

            return ultimo_pago['status'], acquirer_tid, acquirer_nsu
        else:
            return 'not_paid', '', ''