# -*- coding: UTF-8 -*-
"""
Utility module.
"""
import logging
import os
from logging import getLogger

_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
_DEFAULT_LOG_PATH = None  # don't write to a file in default
_DEFAULT_LOG_LEVEL = logging.INFO

__author__ = 'kensk8er'


def get_logger(name, filepath=None, log_level=None):
    """Prepare logger for a given name space."""
    log_level = log_level or _DEFAULT_LOG_LEVEL
    logger = getLogger(name)
    logger.setLevel(log_level)
    formatter = logging.Formatter(_LOG_FORMAT)

    # stream handler
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(log_level)
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)

    # file handler
    filepath = filepath or _DEFAULT_LOG_PATH
    if filepath:
        set_log_path(logger, filepath, log_level)

    return logger


def set_log_path(logger, filepath, log_level=None):
    """Set FileHandler with the filepath for the given logger."""
    log_level = log_level or _DEFAULT_LOG_LEVEL
    formatter = logging.Formatter(_LOG_FORMAT)

    dirpath = os.path.dirname(filepath)
    if not os.path.exists(dirpath):
        os.mkdir(dirpath)

    # remove existing FileHandlers
    for handler in logger.handlers:
        if isinstance(handler, logging.FileHandler):
            logger.removeHandler(handler)

    file_handler = logging.FileHandler(filepath)
    file_handler.setLevel(log_level)
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)


def set_log_level(logger, log_level: int):
    """Set log level for the given logger."""
    logger.setLevel(log_level)
    for handler in logger.handlers:
        handler.setLevel(log_level)


def set_default_log_path(filepath: str):
    """Set the default path for log files."""
    global _DEFAULT_LOG_PATH
    _DEFAULT_LOG_PATH = filepath


def set_default_log_level(log_level: int):
    """Set the default log level for logging."""
    global _DEFAULT_LOG_LEVEL
    _DEFAULT_LOG_LEVEL = log_level