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

class gamarra(woocommerce):
    def __init__(self, argv:list):
        super(gamarra, self, ).__init__(argv)

    def pedidos_handler(self, data) :
        """Funcao para manipular os dados vim do GET de pedidos de todas as integraçoes
            - Ela grava os dados dos pedidos no sistema Softdib
        Args:
            data (dict): []
        """        

        #for order in filter(lambda order: order['id'] in [5270, 5271], data): # - woocommerce    
        #for order in filter(lambda order: order['id'] in [62951, 63215], data): # - woocommerce        
        #for order in filter(lambda order: order['id'] in [63314], data): # - woocommerce        
        for order in data:

            status_paid, tid, nsu = self.status_paid(order)

            if status_paid != "paid":
                continue
            
            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

                order_to_send['pedido'       ]  = self.call("get_order_data" , self.current_order, is_required = True) #[ self.extractValues(order, 'pedido_fields') ]
                
                if order_to_send['pedido'       ][0]['CDFRETE'] == 0:
                    continue
                 
                # Trocando o NSU e TID pelo do pagarme
                order_to_send['pedido'][0]['NSU'] = nsu
                order_to_send['pedido'][0]['TID'] = tid
            
                order_to_send['itenscarrinho']  = self.call("get_order_items", self.current_order, is_required = True) 
                
                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']
                    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())        
                
            # Limpa a variavel
            self.current_order = {}

    # def status_paid(self, order) :

    #     _paid    = list(filter(lambda ind: ind['key'] in '_pagarme_response_data' ,  order['meta_data']))
        
    #     cpos = json.loads(_paid[0]['value'])
       
    #     paid =  cpos['charges'][0]['status']
        
    #     return paid
    
    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['id'])
        )

        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', '', ''
    
    #--------------------------------------------------------#
    #--------------- TRATAMENTO FILTROS DE ROTA -------------#
    #--------------------------------------------------------#
    
    def rote_filter_orders(self):
        
        sql =  """
            SELECT 
                DTULTIMAALTERACAO 
            FROM 
                TBRELACIONAID
            WHERE 
                1=1 
            AND 
                NMTABELA = '{table}'
            AND NMNOMEAPI = '{nomeApi}'                
            ORDER BY 
                DTULTIMAALTERACAO DESC 
            LIMIT 1;
        """.format(table=self.atualWs['table'],nomeApi=self.apiName)
        
        fetch = self.getDb().select(sql)
        
        if len(fetch) :
            alterado_apos = fetch[0]['DTULTIMAALTERACAO']
        else :
            alterado_apos = "2024-09-01T00:00:00"
        
        #alterado_apos = "2024-09-01T00:00:00"

        # Retornando 2hrs para verificar pedidos que possivelmente foram desconsiderados
        novo_alterado_apos = alterado_apos - timedelta(hours=2)
        alterado_apos = datetime.strftime(novo_alterado_apos,'%Y-%m-%dT%H:%M:%S')
            
        alterado_ate = datetime.strftime(datetime.now(),'%Y-%m-%dT%H:%M:%S')
        
        ### return  self.mountRouteParams( { "since_numero": 11776    } )
        #                  "status" : 'completed'
        #                  "status" : 'captured'
        
        return  self.mountRouteParams(
            {
                  "status[0]" : 'completed'
                , "status[1]" : 'processing'
                , "modified_after" : alterado_apos
                , "modified_before": alterado_ate
                , "per_page" : 20
                , "order" : "asc"
                , "orderby"  : "id"
                #,"since_numero": 8840
  
            }
        )