# -*- coding: utf-8 -*-
"""
Created on 2012-6-12

@author: cheng.tang
"""

import logging
import time
import logging.handlers


class _LogFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        logging.Formatter.__init__(self, *args, **kwargs)

    def format(self, record):
        try:
            record.message = record.getMessage()
        except Exception, e:
            record.message = "Bad message (%r): %r" % (e, record.__dict__)
        #record.asctime = time.strftime(
        #    "%y%m%d %H:%M:%S", self.converter(record.created))
        record.asctime = time.strftime(
            "%m%d %H:%M:%S", self.converter(record.created))
        #prefix = '[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]' % \
        #    record.__dict__
        prefix = '[%(levelname)1.1s %(asctime)s]' % record.__dict__

        formatted = prefix + " " + record.message
        if record.exc_info:
            if not record.exc_text:
                record.exc_text = self.formatException(record.exc_info)
        if record.exc_text:
            formatted = formatted.rstrip() + "\n" + record.exc_text
        return formatted.replace("\n", "\n    ")


def _enable_pretty_logging(**kwargs):
    """Turns on formatted logging output as configured.
    This is called automatically by `parse_command_line`.
    """
    log_file_prefix = kwargs.get('log_file_prefix', None)
    log_to_socket = kwargs.get('log_to_socket', None)
    root_logger = logging.getLogger()
    if log_file_prefix:
        # 10M
        log_file_max_size = kwargs.get('log_file_max_size', 1024 * 1024 * 10)
        log_file_num_backups = kwargs.get('log_file_num_backups', 5)
        #channel = ConcurrentRotatingFileHandler(
        channel = logging.handlers.RotatingFileHandler(
            mode="a",
            filename=log_file_prefix,
            maxBytes=log_file_max_size,
            backupCount=log_file_num_backups)
        channel.setFormatter(_LogFormatter())
        root_logger.addHandler(channel)

    if log_to_socket:
        channel = logging.handlers.SocketHandler('localhost',
                    logging.handlers.DEFAULT_TCP_LOGGING_PORT)
        channel.setFormatter(_LogFormatter())
        root_logger.addHandler(channel)

    if kwargs.get('log_to_std', 'true') == 'true':
        channel = logging.StreamHandler()
        channel.setFormatter(_LogFormatter())
        root_logger.addHandler(channel)


def setup_logger(**kwargs):
    level = kwargs.get('log_level', 'info')
    level_str = dict(info=logging.INFO, debug=logging.DEBUG,
                     error=logging.ERROR, warning=logging.WARNING,
                     critical=logging.CRITICAL)
    logging.getLogger().setLevel(level_str.get(level, logging.INFO))
    _enable_pretty_logging(**kwargs)
