
# -- coding: utf-8 --
'''PYTHONIOENCODING=utf-8 python3 ws.py mercos'''

import re, json

#generic = importlib.import_module('generic')
from   generic.gn_api       import   gn_api # 
from   generic.gn_request   import   Request # 

class flexy(gn_api) :
    
    def __init__(self, argv:list):
        self.db = False
        setup = self.setup(argv)
        
        self.ApplicationToken  = setup[0]    [  'NMTOKEN2API'] #lu80x8vw34eczfskx33t4
        self.CompanyToken      = setup[0]    ['NMTOKEN2DADOS']
        
        self.flexy_request = Request(
            base_url ='https://brwsuprimentosb2b.api.flexy.com.br/platform/api/',
            params={
                "token" : self.ApplicationToken
            }
        ) 
        
        super(flexy, self, ).__init__()
        
        
    #--------------------------------------------------------#
    #------------------- TRATAMENTO GET ---------------------#
    #--------------------------------------------------------#
    
        
    #--------------------------------------------------------#
    #---------------- TRATAMENTO TRANSLATE ------------------#
    #--------------------------------------------------------#

    #!flexy
    def tipo_pessoa(self, value) :
        return "J" if len(value) > 11 else "F"
        
    #!flexy
    def orders_vendedor(self, value):
        #sql = "SELECT CDVENDEDOR FROM TBVENDEDOR WHERE 1=1 AND NMEMAIL ='{}' ".format(value)
        #return self.fetchFirst(self.getDb().select(sql),'CDVENDEDOR') or value
        return self.getDb().simple_select(fields=["CDVENDEDOR"], table="TBVENDEDOR", where=["NMEMAIL ='{}'".format(value)], onlyFirst=True)
        
    
    #!flexy
    def orders_cliente(self, value):
        #sql = "SELECT CDCLIENTE FROM TBCLIENTE WHERE 1=1 AND VLCPFCNPJ ='{}' ".format(value)
        #return self.fetchFirst(self.getDb().select(sql),'CDCLIENTE') or value
        return self.getDb().simple_select(fields=["IDSOFTDIB"], table="RELACIONAID", where=["IDAPI='{}'".format(value)], onlyFirst=True)
        
    
    #!flexy
    def orders_metodos_frete(self, value):
        
        shipping_method = {
        
                "correios.axado"                 : "1"
            ,   "correios.esedex"                : "1"
            ,   "correios.pac"                   : "1"
            ,   "correios.sedex"                 : "1"
            ,   "shipping.method.bipboy"         : "3"
            ,   "shipping.method.braspress"      : "3"
            ,   "shipping.method.jadlog"         : "3"
            ,   "shipping.method.jamef"          : "3"
            ,   "shipping.method.transpofrete"   : "3"
            ,   "shipping.method.pickuponplace"  : "3"
        }
        
        return shipping_method[value] if value in shipping_method else '0'
        
        
    #!flexy
    def orders_metodos_pagamento(self, value):
        
        
        if value :
            
            data  = value[-1]
            name  = data['name']
            
            credit_card = "CARTAO CREDITO {}X".format(data['installments']) 
            payment_method = {
                    'payment.method.creditcard.hipercard'           : credit_card
                ,   'payment.method.creditcard.oipaggo'             : credit_card
                ,   'payment.method.creditcard.visa'                : credit_card
                ,   'payment.method.creditcard.visaelectron'        : credit_card
                ,   'payment.method.creditcard.mastercard'          : credit_card
                ,   'payment.method.creditcard.americanexpress'     : credit_card
                ,   'payment.method.creditcard.elo'                 : credit_card
                ,   'payment.method.creditcard.dinners'             : credit_card
                ,   'payment.method.creditcard.jcb'                 : credit_card
                ,   'payment.method.creditcard.discover'            : credit_card
                ,   'payment.method.creditcard.aura'                : credit_card
                ,   'payment.method.creditcard.bndes'               : credit_card
                ,   'payment.method.boleto'                         : 'BOLETO-SITE'
                ,   'payment.method.boletoafaturar'                 : 'BOLETO A PRAZO-SITE'
                ,   'payment.method.deposit'                        : 'DEPOSITO EM CONTA-SITE'
                ,   'payment.method.forfree'                        : ''
                ,   'payment.method.negotiable'                     : ''
            }
            
            payment_method = payment_method[name] if name in payment_method else '0'
            fetch = self.getDb().simple_select(fields = ["CDCONDPGTO"], table="TBCONDPGTO", where=["DSCONDPGTO='{}'".format(payment_method)], onlyFirst=True )
            
            #return fetch['CDCONDPGTO'] if 'CDCONDPGTO' in fetch else ''
            return fetch.get("CDCONDPGTO") or ''
            
        else :
            return '0'
        
    #!flexy
    def customer_data(self, data) :
        
        data['IDCLIENTEEXTERNO'] = self.current_order['customer']['identityNumber']
        return data
    
    #--------------------------------------------------------#
    #------------------- TRATAMENTO PUT POST-----------------#
    #--------------------------------------------------------#
    def observacao_brw(self, data, props) :
        
        if not data: return ''
        
        shippingAddress = str(data.get('shippingAddress',{}))
        #shippingAddress = shippingAddress.replace("{",{}).replace("}",{}).replace(",","\n")
        
        shippingMethod =  str(data.get('shippingMethod',{}))
        #shippingMethod = shippingMethod.replace("{","").replace("}","").replace(",","\n")
        
        data =  shippingAddress + '\n' + shippingMethod
        #print(data)
        data = self.multi_replace(data,[
                ['{','']
            ,   ['}','']
            ,   [',',',\n']
            ,   ['postCode','CEP']
            ,   ['city','Cidade']
            ,   ['state','Estado']
            ,   ['country','Pais']
            ,   ['street','Rua']
            ,   ['district','Bairro']
            ,   ['complement','Complemento']
            ,   ['number','Numero']
            ,   ['name','Nome Transportadora']
            ,   ['referenceCode','Codigo na Loja Integrada']
            ,   ['estimatedDeliveryFrom','Estimativa de Entrega de']
            ,   ['estimatedDeliveryTo','Estimativa de Entrega para']
            ,   ['deliveryTimeFrom','Tempo de Entrega de']
            ,   ['deliveryTimeTo','Tempo de Entrega para']
            ,   ['price','Preco-Frete']
            ,   ['carrier','Operadora']
            ,   ['observations','Observacao']
            ,   ['quoteId','Id de Cotacao']
            ,   ['None','']
        ])
        
        return data
        
        
    def transportador_brw (self, transportadora, propos):
        transportadoras = {
            "JADLOG":"T00493"
        ,   "JAMEF" :"T00489"
        ,   "BRASPRESS":"T00076"
        }
        if transportadora:
            transportadora = transportadora.upper()
            transportadora = transportadora in transportadoras and transportadoras[transportadora]
        else:
            transportadora = ''
            
        
        return transportadora
        
        
    
    #--------------------------------------------------------#
    #------------------ TRATAMENTO RESPONSE  ----------------#
    #--------------------------------------------------------#
    
    def response_code_200(self, req) :
        return super().response_code_201(req)
    
    #--------------------------------------------------------#
    #------------------- TRATAMENTO BEFORESEND --------------#
    #--------------------------------------------------------#
    
    def beforeSend_products(self, data) :
        #pass
        if self.current_data['request_method'] == 'PUT' and self.nmlkgrupo.lower() == 'brw' :
            del data['product']['categories']
            del data['product']['properties']
            del data['product']['videos']
            del data['product']['descriptionGroup']
            del data['product']['productsRelated']
            del data['product']['name']
            del data['product']['slug']
        
        if not self.current_data['priceList'] :
            del data['product']['variants'][0]['priceList']
            
        
        
        
        
    #!flexy
    def beforeSend_customers(self, data):
        """  """
        itens_rejected_pessoa_juridica = (
                "firstName" , "lastName"
            #,   "gender"    , "dateOfBirth"
        )
        itens_rejected_pessoa_fisica   = (
                "companyName"           , "tradeName"        
            ,   "freeStateRegistration" , "stateRegistration"
            ,   "responsible"           
        )
        
        get_tipo_pessoa = self.tipo_pessoa(data['identityNumber'])
        
        if not len(get_tipo_pessoa) :
            return {}
        
        if get_tipo_pessoa[0] == "J":
            del_itens = itens_rejected_pessoa_juridica
        else :
            del_itens = itens_rejected_pessoa_fisica
            
        for item in del_itens :
            del data[item]
            
        return data
        
    #!flexy
    def beforeSend_categories(self, item) :
        """ Remove a categoria pai se identificador for ela mesmo """
        if item['category']['parent'] == item['category']["referenceCode"] :
            del(item['category']['parent'])
        
        return item
        
        
    #--------------------------------------------------------#
    #------------------- TRATAMENTO AFTERSEND  --------------#
    #--------------------------------------------------------#
    
    def afterSend_orders_status(self, data) :
        
        self.getDb().delete(
                    "TBPEDIDOSSTATUS"
                ,   ["IDTBPEDIDOSSTATUS={}".format(self.current_data['softdib_id'] )]
                )
        
    #--------------------------------------------------------#
    #-----------------TRATAMENTO DOS CUSTOM------------------#
    #--------------------------------------------------------#
    
    #?POR ENQUANTO SO NA FLEXY MAS PODE SER GLOBAL
    ## GERAL ##
    def slug(self, data) :
        return """
            ( LOWER( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( TRIM({}),':','' ),'+','' ), ')','' ),'(','' ),',','' ),'', '' ),' \ / ', '' ), ' "', '' ), '?', '' ), '/', '-' ), '&', '' ), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-')))
        """.format(data['dbfield']
    )
        
    ## ESPECIFICO ##
    
    # customers
    def customers_names(self, data) :
        index = 1 if data['para'] == 'firstName' else -1
        return """ SUBSTRING_INDEX({0}, " ", {1}) """ \
                .format(data['dbfield'], index)
        
    def customers_freeStateRegistration(self, data) :
        return """(
            SELECT 
            (CASE 
                WHEN TBCLIENTE.FGCONSUMIDORFINAL = 'S' 
                    THEN 'true' ELSE 'false' END
            )
        )"""
        
        
    def customers_stateRegistration(self, data) :
        return """(
            SELECT 
            (CASE 
                WHEN TBCLIENTE.VLINSCRICAOESTADUAL = '' 
                    THEN 'ISENTO' ELSE TBCLIENTE.VLINSCRICAOESTADUAL END
            )
        )"""
        
    def customers_customerType(self, data) :
        return """(
            SELECT 
            (CASE 
                WHEN TBCLIENTE.CDGRUPOCLIENTE = '200' 
                    THEN 'consumidor' ELSE 'INTEGRACAO' END
            )
        )"""
        
    
    def control_stock(self, data):
        return "GREATEST({}, 0)".format(data['dbfield'])
        
    
    # Nao usado ainda
    # '[\"' + TBPRODUTO.CDGRUPO + '.' + '0' + '\",\"' + TBPRODUTO.CDGRUPO + '.' + TBPRODUTO.CDSUBGRUPO   +'\"' + (SELECT ( CASE WHEN  TBPRODUTO.CDLINHA <> \"\" THEN ( SELECT CONCAT( CAST(',\"888.' AS CHAR), CAST(TBPRODUTO.CDLINHA AS UNSIGNED), CAST('\"' AS CHAR) ) ) ELSE \"\" END ) ) + ']'
    def categories(self, data):
        return self.processItem_dbfield({'dbfield' :
            """
            '[\"' + TBPRODUTO.CDGRUPO + '.' + '0' + '\",\"' + TBPRODUTO.CDGRUPO + '.' + TBPRODUTO.CDSUBGRUPO   +'\"'
                +
            (SELECT
                    (
                        CASE
                            WHEN  TBPRODUTO.CDLINHA <> "" THEN (
                                SELECT
                                    CONCAT(
                                        CAST(',"888.' AS CHAR),
                                        CAST(TBPRODUTO.CDLINHA AS UNSIGNED),
                                        CAST('"' AS CHAR)
                                    )
                            )
                            ELSE ""
                        END
                    )
            ) 
            
        +
                
            ']'
            """
        })
    
    
    
    
    #TODO: colocar no map
    def products_priceList(self, data):
        # return """ 
        #     (
        #         SELECT
        #             GROUP_CONCAT(DISTINCT
        #                 "{" , 
        #                         '"price":' ,   TBTABPRECOPRODUTO.VLPRODUTO  ,
        #                     "," ,'"criteria":' '"', TBTABPRECOPRODUTO.CDTABELA , '"'
                            
        #                 "}"
        #             ) AS tmp
                    
        #             FROM TBTABPRECOPRODUTO
        #             WHERE
        #                 TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO
                
        #     ) 
        # """
        
        return """ 
            (
                SELECT DISTINCT (
                        CASE
                        WHEN NOT EXISTS(
                            SELECT
                                TBTABPRECOPRODUTO.VLPRODUTO
                            FROM
                                TBTABPRECOPRODUTO
                            WHERE
                                TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO
                            ) THEN ""
                
                        ELSE(
                            SELECT
                                GROUP_CONCAT(
                                    DISTINCT "{",
                                    '"price":',
                                    TBTABPRECOPRODUTO.VLPRODUTO,
                                    ",",
                                    '"criteria":' '"',
                                    TBTABPRECOPRODUTO.CDTABELA,
                                    '"' "}"
                                ) AS tmp
                            FROM
                                TBTABPRECOPRODUTO
                            WHERE
                                TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO
                            )
                        END
                )
            )
                          
        """
                    


















        
    def products_images(self, data):
        return """ 
        (SELECT
            DISTINCT (
                CASE
                    WHEN NOT EXISTS(
                        SELECT
                            TBPRODUTOIMAGEM.NMIMAGEM
                        FROM
                            TBPRODUTOIMAGEM
                        WHERE
                            TBPRODUTOIMAGEM.CDPRODUTO = TBPRODUTO.CDPRODUTO
                    ) THEN ""
                    ELSE (
                        SELECT
                            GROUP_CONCAT(
                                '"',
                                TBPRODUTOIMAGEM.NMIMAGEM,
                                '"'
                            ) AS tmp
                        FROM
                            TBPRODUTOIMAGEM
                        WHERE
                            TBPRODUTOIMAGEM.CDPRODUTO = TBPRODUTO.CDPRODUTO
                    )
                END
            )
        )
        """
        #LJ6012
    
    #!deprecated
    def agents_token_customers_identityNumber(self, data) :
        
        return """ 
            (
                SELECT
                    GROUP_CONCAT(DISTINCT
                        "{" , 
                            '"identityNumber":' ,  '"', TBCLIENTE.VLCPFCNPJ ,'"'
                        "}"
                ) AS tmp
                
            ) 
        """
        print(data)
    
    def lower_case(self, data) :
        return """
            (LOWER({field}))
        """.format(field = data['dbfield'])
        
    
    #--------------------------------------------------------#
    #--------------- TRATAMENTO FILTROS DE ROTA -------------#
    #--------------------------------------------------------#
    def rote_filter_orders(self):
        
        return  self.mountRouteParams(
            {
                    "status" : "status.paid" 
                    #"status" : "status.waiting_shipment" 
                    #"status" : "status.canceled" 
                    #"status" : "status.preparing_shipment"
                    
                    
                
            }
        )
        
    #--------------------------------------------------------#
    #--------------- TRATAMENTO ITEMS/PEDIDO ----------------#
    #--------------------------------------------------------#
    
    def get_order_items(self, order):
        items = []
        for item in order['items']:
            self.current_oder_item  = item
            items.append(self.extractValues(self.current_oder_item , "itenscarrinho_fields"))
            
        return items
        
        
    def get_order_data(self, order) :
        return [ self.extractValues(order, 'pedido_fields') ]
        
    def variant_price(self, value) :
        
        promotional_price = self.current_oder_item['variant'].get('promotionalPrice')
        return promotional_price if promotional_price else value
            
        
    
    #--------------------------------------------------------#
    #--------------- TRATAMENTO STATUS PEDIDO ---------------#
    #--------------------------------------------------------#
    
    def save_status(self, retorno_cobol):
        
        
        req_orders_status = self.api_request.doRequest(
                rote    = "orders/status/"
            ,   method  = "PUT"
            ,   json    = {
                    "number"    : retorno_cobol[-1]['CDPEDIDOEXTERNO'],
                    "status"    : "status.waiting_shipment",
                    "info"      : "Pedido gravado no Sistema. Aguardando envio"
                }
        )
        print("req_orders_status")
        return req_orders_status, req_orders_status.status_code == 200 
        
    
    def __del__(self):
        self.createLog("999","Final da exportacao")
    #--------------------------------------------------------#
    #---------------------- FUNCOES GERAIS ------------------#
    #--------------------------------------------------------#


