# coding=utf-8
from logging.handlers import TimedRotatingFileHandler

import os
import sys
import logging


class LoggerFactory:

    @staticmethod
    def create_logger(name=None, level=logging.INFO):
        """create a logger

        Args:
            name (str): name of the logger
            level: level of logger

        Raises:
            ValueError is name is None
        """

        if name is None:
            raise ValueError("name for logger cannot be None")

        formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] "
                                      "[%(filename)s:%(lineno)d:%(funcName)s] %(message)s")

        logger_ = logging.getLogger(name)
        logger_.setLevel(level)
        logger_.propagate = False
        ch = logging.StreamHandler(stream=sys.stdout)
        ch.setLevel(level)
        ch.setFormatter(formatter)
        logger_.addHandler(ch)
        return logger_

    @staticmethod
    def create_logger_with_file(log_file_path: str = None, logger_level=logging.INFO):
        logger_inner = logging.getLogger()
        logger_inner.setLevel(logger_level)
        logger_inner.propagate = True

        formatter = logging.Formatter(fmt="[%(asctime)s] [%(filename)s:%(lineno)s - %(levelname)s] %(message)s",
                                      datefmt="%Y-%m-%d %H:%M:%S")

        # TimedRotatingFileHandler
        if log_file_path:
            basedir = os.path.dirname(log_file_path)
            if not os.path.isdir(basedir):
                os.makedirs(basedir, exist_ok=True)
            handler_file = TimedRotatingFileHandler(log_file_path, when="d", interval=1, backupCount=30)
            handler_file.setFormatter(formatter)
            logger_inner.addHandler(handler_file)

        # StreamHandler
        handler_console = logging.StreamHandler()
        handler_console.setFormatter(formatter)
        logger_inner.addHandler(handler_console)
        return logger_inner