
import re, json, hashlib
from unittest import result
from  generic.gn_api       import   gn_api #
from  generic.gn_request   import   Request # 
from  generic.gn_soap   import   gn_soap #
from  generic.gn_mysql import gn_mysql # 
from datetime import datetime

from xmljson import parker, Parker
from xml.etree.ElementTree import fromstring
from lxml import etree
from itertools import repeat
from bs4 import BeautifulSoup

class mysuite(gn_soap):
    def __init__(self, argv:list):
        
        self.SIGLA               = 'dib'
        self.SERVICEKEYWSDL      = 'ad2e6cf06871cc8d3bea3035d75fbb63'
        self.SENHASERVICE        = '469d11b3b3159458b6858559b84f5d7e'
        self.DOMINIO             = 'http://www.mysuite.com.br/'
        self.EMPRESA_PATH        = f'empresas/{self.SIGLA}/webservices/'
        self.DATE                = datetime.now().strftime('%Y%m%d')
        self.SERVICEKEY          = hashlib.md5(f'{self.SIGLA}{self.SENHASERVICE}{self.DATE}'.encode() ).hexdigest()
        self.mysuite_request     = None
        
        self.suffix = ''
        
        self.db = gn_mysql();
        self.db.pydb_connection(
                host    = 'localhost'
            ,   user    = 'root'
            ,   passwd  = 'cedros'
            ,   db      = 'mysuite'
        )
        
        
        super(mysuite, self, ).__init__(argv)
        print('Fim')
        
    
    def get_sigla(self, value):
        return self.SIGLA
        
    def get_servicekey(self, value):
        return self.SERVICEKEY
        
    
    def xml2json(self, data, **kwargs) :
        #escape_illegal_xml_characters = lambda x: 
        xml = re.sub(u'[\x00-\x08\x0b\x0c\x0e-\x1F\uD800-\uDFFF\uFFFE\uFFFF]', '', data);#BeautifulSoup(data, features="lxml")
        return json.loads(json.dumps(parker.data(fromstring(str(xml)))))
        
        
    
    def formulariohelpdesk_obter_lista(self):
        
        self.mysuite_request = Request(
                base_url = f'{self.DOMINIO}{self.EMPRESA_PATH}'
            ,   method = 'POST'
            ,   headers ={
                'SOAPAction':  f'{self.DOMINIO}{self.EMPRESA_PATH}{self.rote}#obterLista'
            }
            ,   params   = {
                #    'format'           : 'json' 
                    'sigla'             : self.SIGLA 
                ,   'servicekeywsdl'    : self.SERVICEKEYWSDL
                
        }) 
    
    def recuperar_dados_db(self, dados):
        
        result = self.db.select(
        f"""
        SELECT
            dep.codgrupo AS coddepartamento,
            dep.nomeGrupo AS desc_departamento,
            cat.descricao AS desc_categoria,
            st.descricao AS desc_status,
            CONCAT_WS(' ',usu.nome, usu.sobrenome) AS desc_usuario,
            cli.nomecompleto AS desc_cliente,
            emp.codempresa AS cod_emp_cliente,
            emp.nomeempresa AS desc_emp_cliente,
            emp.cnpj AS cnpj_emp_cliente,
            class.classificacao AS desc_class,
            usuni.codgrupoamigos AS dep_usuario
        FROM
            hd_ticket
            LEFT JOIN gruposamigos dep ON dep.codgrupo = (select codgrupoamigos from usuariosunidades where codusuario =  '{dados.get("codusuario","")}')
            LEFT JOIN hd_categoria cat ON cat.codcategoria = '{dados.get("codcategoria","")}'
            LEFT JOIN hd_status st ON st.codstatus = '{dados.get("codstatus","")}'
            LEFT JOIN usuarios usu ON usu.codusuario = '{dados.get("codusuario","")}'
            LEFT JOIN clientes cli ON cli.codcliente = '{dados.get("codcliente","")}'
            LEFT JOIN empresas emp ON emp.codempresa = cli.codempresa
            LEFT JOIN hd_classificacao class ON class.codclass =  '{dados.get("codclass","")}'
            LEFT JOIN usuariosunidades usuni ON usuni.codusuario =  '{dados.get("codusuario","")}'
        WHERE 1=1 LIMIT 1
        """)
        
        #ticket.codticket = '{dados.get("codticket","")}' ;
        
        return self.arr_first(result)
        
        
        
        
    def ticket_default_output(self, dados, dados_db):
        cnpj_emp_cliente = dados_db.get("cnpj_emp_cliente","") or "0"
        
        return [
                dados.get("codticket"                     ,"") or ""
            ,   dados_db.get("coddepartamento"               ,"") or ""
            ,   dados_db.get("desc_departamento"          ,"") or ""
            ,   dados.get("codcategoria"                  ,"") or ""
            ,   dados_db.get("desc_categoria"             ,"") or ""
            ,   dados.get("codclass"                      ,"") or ""
            ,   dados_db.get("desc_class"                 ,"") or ""
            ,   dados.get("codstatus"                     ,"") or ""
            ,   dados_db.get("desc_status"                ,"") or ""
            ,   dados.get("titulo"                        ,"") or ""
            ,   dados.get("descricao"                     ,"") or ""
            ,   dados.get("codusuario"                    ,"") or ""
            ,   dados_db.get("desc_usuario"               ,"") or ""
            ,   dados_db.get("dep_usuario"                ,"") or ""
            ,   dados.get("codusuarioitem"                ,"") or ""
            ,   dados_db.get("desc_codusuarioitem"        ,"") or ""
            ,   dados.get("prioridade"                    ,"") or ""
            ,   dados.get("avaliacao"                     ,"") or ""
            ,   dados.get("ticketsabertos"                ,"") or ""
            ,   dados.get("ticketsnaolidos"               ,"") or ""
            ,   dados.get("ticketscomanexo"               ,"") or ""
            ,   dados.get("ticketslidosseminteracao"      ,"") or ""
            ,   dados.get("bloqueado"                     ,"") or ""
            ,   self.timefromtimestamp_to_cobol(dados.get("dtabertura"     ,None)) or ""
            ,   self.timefromtimestamp_to_cobol(dados.get("dtalteracao"    ,None)) or ""
            ,   self.timefromtimestamp_to_cobol(dados.get("dtfechamento"   ,None)) or ""
            ,   self.timefromtimestamp_to_cobol(dados.get("dtprevisao"     ,None)) or ""
            ,   self.timefromtimestamp_to_cobol(dados.get("dtitem"         ,None)) or ""
            ,   dados.get("codcliente"                    ,"") or ""
            ,   dados_db.get("desc_cliente"               ,"") or ""
            ,   dados_db.get("cod_emp_cliente"            ,"") or ""
            ,   dados_db.get("desc_emp_cliente"           ,"") or ""
            ,   int(''.join(filter(str.isdigit, cnpj_emp_cliente))) or ""
            ,   self.timefromtimestamp_to_cobol(dados.get("dtleituracliente"  ,None)) or ""
            ,   dados.get("operadorleu"                   ,"") or ""
            
            
        ]
        
    
    
    def out_formulariohelpdesk_obter_lista(self) :
        dados = self.response_json.get('dados',{})
        items = []
        if dados:
            items = dados.get("item")
            if  isinstance(items, dict):
                items = [items]
                
        output = []
        for item in items:
            dados_db = self.recuperar_dados_db(item)
            saida = self.ticket_default_output(item,dados_db)
            output_text = "|".join( str(x) for x in saida ) 
            output.append(output_text)
            
            
        text_cobol = "\n".join(output).encode('iso-8859-1','ignore')
        text_cobol = text_cobol.decode('iso-8859-1')
        self.write_file(text_cobol, self.saida_cobol ,flag= "w+", encoding='iso-8859-1' )
        
    
    def formulariohelpdesk_obter(self):
        
        self.mysuite_request = Request(
                base_url = f'{self.DOMINIO}{self.EMPRESA_PATH}'
            ,   method = 'POST'
            ,   headers ={
                'SOAPAction':  f'{self.DOMINIO}{self.EMPRESA_PATH}{self.rote}#obter'
            }
            ,   params   = {
                #    'format'           : 'json' 
                    'sigla'             : self.SIGLA 
                ,   'servicekeywsdl'    : self.SERVICEKEYWSDL
                
        }) 
    
    
    def timefromtimestamp_to_cobol(self, timestamp):
        if not timestamp: return ""
        
        date = datetime.fromtimestamp(timestamp)
        return date.strftime("%Y%m%d")
        
        
    def mensagem_outpup(self,dados):
        
        usuario =   self.getDb().simple_select(
                fields  =["nome"]
            ,   table   ="usuarios"
            ,   where   =[f"codusuario='{dados.get('codusuario')}'"],
                onlyFirst=True
        )
        
        output =  [
            str(dados.get('codusuario')),
            usuario.get('nome',''),
            self.timefromtimestamp_to_cobol(dados.get("dtitem","")),
            
            self.multi_replace(BeautifulSoup(dados.get("descricao",""), features="lxml").get_text(separator=" ") ,[
                ["\r"," "],
                ["\n"," "],
                ["|","!"]
            ])[:5000],
            
        ]
        return "|".join(output)
        
        
        
    def out_formulariohelpdesk_obter(self) :
        
        
        dados = self.response_json.get('dados',{})
        obterResultDadosInteracao  = dados.get("obterResultDadosInteracao",{}).get('item')
        #item = list(filter(lambda desc: not desc["arquivos"],item))
        #descricoes = item[-10:] + list(repeat({},10 - len(item)))
        
        dados_db = self.recuperar_dados_db(dados)
        saida    = self.ticket_default_output(dados,dados_db)
        
        
        text_cobol = "|".join( str(x) for x in saida )
        text_cobol += "\n" + (
        "\n".join(
            [ self.mensagem_outpup(descricao) for descricao  in obterResultDadosInteracao ]))
            
        text_cobol = text_cobol.encode('iso-8859-1','ignore')
        text_cobol = text_cobol.decode('iso-8859-1')
        self.write_file(text_cobol, self.saida_cobol ,flag= "w+", encoding='iso-8859-1' )
        
        
        
        
    def __del__(self):
        self.createLog("999","Final da exportacao")
    
    
    """
'codticket':75565
'coddepartamento':1
'codcategoria':13
'codclass':179
'codstatus':3
'titulo':'SVE456 - Resumo de Notas Fiscais - sve456 - URGENTE'
'descricao':None
'codusuario':37
'codusuarioitem':None
'prioridade':1
'avaliacao':5
'ticketsabertos':None
'ticketsnaolidos':None
'ticketscomanexo':None
'ticketslidosseminteracao':None
'bloqueado':0
'dtabertura':1595620695
'dtalteracao':1595622412
'dtfechamento':1595622412
'dtprevisao':0
'dtitem':None
'codcliente':160
'dtleituracliente':1595622172
'operadorleu':1
    
    
    """
    
    
    
    
    
    