import logging
import time


class LogFormatter(logging.Formatter):

    def __init__(self, docolor, timestamps=False):
        super().__init__()
        self.docolor = docolor
        self.timestamps = timestamps

    def formatMessage(self, record):
        if self.docolor:
            c_lvl = 33
            c_mod = 32
            c_msg = 0

            if record.levelno == logging.WARNING:
                c_lvl = 31
                # c_mod = 33
                c_msg = 33

            elif record.levelno > logging.WARNING:
                c_lvl = 31
                c_mod = 31
                c_msg = 31

            fmt = ''.join([
                '\x1b[%dm' % c_lvl,  # set levelname color
                '%(levelname)8s',    # print levelname
                '\x1b[0m',           # reset formatting
                '\x1b[%dm' % c_mod,  # set name color
                ' %(name)s',         # print name
                '\x1b[%dm' % c_msg,  # set message color
                ': %(message)s',     # print message
                '\x1b[0m'            # reset formatting
            ])
        else:
            fmt = '%(levelname)8s %(name)s: %(message)s'

        if self.timestamps:
            fmt = '%(asctime)s ' + fmt

        if 'asctime' not in record.__dict__:
            record.__dict__['asctime'] = time.strftime(
                "%Y-%m-%d %H:%M:%S",
                time.localtime(record.__dict__['created'])
            )

        return fmt % record.__dict__


class LogHandler(logging.StreamHandler):

    def __init__(self, docolor, timestamps):
        super().__init__()
        self.setFormatter(LogFormatter(docolor, timestamps))