class CreateCert(Thread):
    '''
    Clase que crea y firma los certificados criptograficos de cada titulo
    valor. Recibe en los parametros de inicializacion una instancia de la clase
    ``WatchAndPost`` para poder actualizar tanto el capital como el numero de
    titulos emitidos.

    :param w: Instancia de la clase ``WatchAndPost``
    :param simbolico: porcentaje del valor simbolico
    :param minuto: valor del minuto de trabajo
    :param tiempo: tiempo de trabajo de realizacion de cada bono

    '''
    def __init__(self, w, simbolico, minuto, tiempo):
        Thread.__init__(self)
        self.name = 'CreateCert'
        self.loop = Event()
        #evento para crear el titulo
        self.doit = Event()
        #inicializa en set el evento
        self.doit.set()
        #instancia de WatchAndPost
        self.watcher = w
        self.api = WebApi()
        self.tw = TemplateWriter(template='base65.jinja')
        self.ca = Certificate_generator('keys/generador.key',
                                        'keys/generador.crt')
        self.valor_simbolico = simbolico
        self.valor_minuto = minuto
        self.tiempo_trabajo = tiempo

    def run(self):
        '''
        Esta funcion corre en el fondo hasta ser llamada para crear el
        certificado -cuando llega un dato del puerto serial-. Internamente
        realiza los calculos del porcentaje a agregar al capital y actualiza
        los valores en el estado global del sistema.

        '''
        while not self.loop.is_set():
            #mantiene vivo el thread
            self.loop.wait(0.01)

    def quit(self):
        '''
        Cambia el flag interno para terminar la funcion ``self.run()`` y
        terminar el Thread
        '''
        self.loop.set()

    def create(self):
        logging.debug('generando certificado')
        logging.debug('numero de titulos %s', self.watcher.num_titulos_emitidos)

        #toma el tiempo y suma uno a los titulos
        now = datetime.datetime.now()
        self.watcher.setNumTitulosPlus()
        new_num = self.watcher.num_titulos_emitidos

        #actualiza el valor del capital
        percentage = (self.valor_minuto * self.valor_simbolico) / 100
        addToCapital = percentage * self.tiempo_trabajo
        self.watcher.setCapital(addToCapital)

        logging.debug('>>> valuacion: %s', addToCapital)
        logging.debug('nuevo numero de titulos %s', new_num)

        CA_response = self.ca.generate_and_sign('CO', 'Bogota', 'Bogota',
                        'generador de valores', 'generador de certificados',
                        str(new_num).zfill(9), new_num)

        logging.debug('certificado: %s', CA_response)

        source = self.tw.createSource(CA_response['certificate'], CA_response['digest'],
                        str(new_num).zfill(9), now)

        new_post = self.api.post_valor(new_num, now,
                        CA_response['certificate'],
                        CA_response['key'],
                        source)
        logging.debug('nuevo cert', new_post)
        #al finalizar vuelve a poner el set en el evento
        #self.doit.set()

        return source