import json, gn_request 
from datetime import datetime

__author__      = 'Felipe Basilio'
__email__       = 'felipe@softdib.com.br'
__version__     = '0.1.0'
__description__ =   """ Programa para fazer comunicacao e consulta com  a CCB,
                        Gerar o xml pronto para rodar no layout Jasper
                        
                    """
                    
class ConsultaCCB():
    def __init__(self, **args):
        
        self.args = args
        self.bootstrap()
        self.output()
        
    
    def bootstrap(self) :
        """ Definicoes da consulta com o CCB, todos os dados sao obrigatorio """
        
        if self.args['debug'] :
            self.xml =  self.read_file("84818889_examples.xml")
            return 
            
        
        ccb_url  = "https://www.ccb.inf.br/conveniado/consulta/consultaxml.asp"
        #ccb_url  = "http://www.ccb.inf.br/conveniado/consulta/consultaxml.asp"
        
        self.ccb_request = gn_request.Request(
            params= {
                    "Email"     : self.args['email']
                ,   "Senha"     : self.args['senha']
                ,   "CNPJ"      : self.args['cnpj']
                ,   "Mercado"   : self.args['mercado']
            })
            
        req = self.ccb_request.doRequest(url = ccb_url, verify=False)
        
        if req.status_code != 200:
            print(req.status_code, req.text)
            return
            
        
        self.xml = req.text
        
    
        
        
    def dict_replace(self, string, dictionary):
        for x,y in dictionary.items():
            string = string.replace(x,y)
            
        return string 
        
    
    def wrap_tags(self, **kwargs):
        
        inside = kwargs.get("inside")
        
        tag_open  = "<{}>".format(kwargs.get("tag"))
        tag_close = "</{}>".format(kwargs.get("tag"))
        
        tag_start = kwargs.get("start")
        start = "<{}>".format(tag_start)
        tag_end = kwargs.get("end")
        end = "</{}>".format(tag_end) if tag_end else "</{}>".format(tag_start)
        
        
        return self.dict_replace(kwargs.get("text"), {
                start : start + tag_open if inside else tag_open + start
            ,   end   : tag_close + end  if inside else end + tag_close
        })
        
        
    
    def output(self) :
        """ Saida que vai para o cobol"""
        
        #path = "CONSULTA/CONSULTAS/CONSULTAS_MES/*`|`/$"
        #cobol_text =  self.get_json_value(path, self.json_from_xml)
        
        _dict = {
                "\n"  : ""
            ,   "    "  : " "
            ,   "  "  : " "
            ,   "\t"  : " "
            ,   "> <"  : "><"
            
            
        }
        
        xml = self.layout_jasper(self.xml)
        xml = self.dict_replace(xml,_dict)
        
        self.write_file(
            xml,  
            self.args['retorno'] if not self.args['debug'] else "saida.txt"
        )
        
    
    def layout_jasper(self, xml) :
        out = xml
        out = self.insert_header(out)
        out = self.fix_layout(out)
        out = self.insert_footer(out)
        
        return out
        
    
    def insert_header(self, xml) :
        format = '%H:%M:%S'

        header = """ 
        <header>
            <cab-imagem>{img}</cab-imagem>
            <cab-empresa><![CDATA[{empresa}]]></cab-empresa>
            <cab-filial><![CDATA[{filial}]]></cab-filial>
        </header>
        <CONS_HORA>{hora}</CONS_HORA>
        """.format(
                img     = self.args['imglogo']
            ,   empresa = self.args['empresa']
            ,   filial  = self.args['filial'] 
            ,   hora    = datetime.now().strftime(format)
        )
        
        return self.preped(xml, "CONSULTA", header )
        
    def findAndReplaceWithSequencial(self, closed_tag, xml):
        import re
        import itertools as it
        
        cnt = it.count()
        closed_tag = "</{}>".format(closed_tag)
        
        return re.sub(
            re.escape(closed_tag)
            , lambda x: '{0}<CONSULTAS_ID>{1}</CONSULTAS_ID>'.format(closed_tag,next(cnt) + 1), xml)
        
        
    def fix_layout(self, xml) :
        
        # COSULTA
        xml = self.wrap_tags(
                text    = xml
            ,   tag     = 'ITEM'
            ,   start   = "CONSULTAS_MES"
            ,   end     = "CONSULTAS_CONVS"
            
        )        
        
        xml = self.findAndReplaceWithSequencial('CONSULTAS_CONVS', xml)
        
        # EXPERIENCIA
        xml = self.wrap_tags(
                text    = xml
            ,   tag     = 'ITEM'
            ,   start   = "EXP_REF"
            ,   end     = "EXP_T_INF"
            
        )
        # INFORMACAO
        xml = self.wrap_tags(
                text    = xml
            ,   tag     = 'ITEM'
            ,   start   = "INF_REF"
            ,   end     = "INF_SIT"
            
        )
        # ALERTA
        xml = self.wrap_tags(
                text    = xml
            ,   tag     = 'ITEM'
            ,   start   = "ALE_COD"
            ,   end     = "ALE_OBS"
            
        )
        
        
        return xml
        
    
    def insert_footer(self, xml) :
        footer = """
        <footer>
            <rod-data-hora-sys><![CDATA[{data}]]></rod-data-hora-sys>
            <rod-usuario-sys><![CDATA[{user}]]></rod-usuario-sys>
            <rod-apl-menu-tar><![CDATA[{menu}]]></rod-apl-menu-tar>
            <rod-nome-xml><![CDATA[{name}]]></rod-nome-xml>
        </footer>      
        """.format(
                data = self.args['datasys']
            ,   user = self.args['usuario']
            ,   menu = self.args['menutar']
            ,   name = self.args['nomexml']
        )
        
        return self.append(xml, "CONSULTA", footer )
        
    
    def preped(self, text, target ,value):
        
        tag = "<{}>".format(target)
        return self.dict_replace(text,{
            tag : tag + value
        })
        
        
    def append(self, text, target ,value):
        
        tag = "</{}>".format(target)
        return self.dict_replace(text,{
            tag : value + tag
        })
    
    
    def write_file(self, data="", file="", flag = "w+") :
        with open(file, flag, encoding='utf8') as log :
            log.write(data) 
            
        
    def read_file(self, path) :
        try:
            with open(path , 'r', encoding='utf8') as file:
                return file.read() 
        except IOError as error:
            print(error)
            exit()
            
        
        
if __name__ == "__main__" :
    
    import sys
    
    # Argumentos de entrada para consulta CCB, parametros fixos parassado pelo
    kwargs = {
        
            'email'    : sys.argv[1]
        ,   'senha'    : sys.argv[2]
        ,   'cnpj'     : sys.argv[3]
        ,   'mercado'  : sys.argv[4]
        ,   'retorno'  : sys.argv[5]
        ,   'imglogo'  : sys.argv[6]
        ,   'empresa'  : sys.argv[7]
        ,   'filial'   : sys.argv[8]
        ,   'datasys'  : sys.argv[9]
        ,   'usuario'  : sys.argv[10]
        ,   'menutar'  : sys.argv[11]
        ,   'nomexml'  : sys.argv[12]
        ,   'debug'    : True if sys.argv[-1] == '--debug' else False
        
    }
    # python3 /var/www/html/webservice/ccb/ConsultaCCB.py 'pedrohenrique@multilit.com.br' 'teste123' '95408589' 'N' '/var/www/html/anexos/ccb/RUG083CCB-C00042-20200128.xml' '/user/relatorios/bmp/MULTILIT.jpg' 'MULTILIT FIBROCIMENTO LTDA' 'MULTILIT FIBROCIMENTO LTDA' '20200128' 'SAC' '08' 'RUG083CCBR.jrxml'
    
    ConsultaCCB(**kwargs)
    
""" 
    Email: pedrohenrique@multilit.com.br
    Senha:  teste123
    CNPJ: é o n° raiz do CNPJ que deseja consultar
    Mercado:  NÃO UTILIZAR (este item faz uma cobrança adicional se utilizado)
    
    
    http://www.ccb.inf.br/conveniado/consulta/consultaxml.asp?Email=Email&Senha=Senha&CNPJ=CNPJ&Mercado=N
    ou
    http://www.bandeirantes.inf.br/conveniado/consulta/consultaxml.asp?Email=Email&Senha=Senha&CNPJ=CNPJ&Mercado=N 

"""
    