#!/usr/bin/env python3
"""
   utils.configuration.app_logger.py file for the c3 printing system.
"""

###
### DEPENDENCIES
###
import sys
import logging


def setup_logger(name: str,
                 level: str | None = "INFO",
                 log_formatter: str | None = None,
                 log_file: str | None = None,
                 log_file_append: bool | None = False
                 ) -> logging.Logger:

    if level == "DEBUG":
        lvl = logging.DEBUG

    elif level == "INFO":
        lvl = logging.INFO

    elif level == "WARNING":
        lvl = logging.WARNING

    elif level == "ERROR":
        lvl = logging.ERROR

    else:
        print(f"\nERROR ---> Could not set logger for: {name}.\n LogLevel parsed '{level}' is unknown...\n\n")
        sys.exit()

    # Create a logger
    logger = logging.getLogger(name)

    # Set the logging level
    logger.setLevel(lvl)

    # Avoid adding multiple handlers
    if not logger.hasHandlers():

        # Set log formatter
        if log_formatter is None:
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

        else:
            formatter = logging.Formatter(log_formatter)

        if log_file is not None:
            if log_file_append:
                fh = logging.FileHandler(log_file, mode="a")
            else:
                fh = logging.FileHandler(log_file)

            fh.setLevel(lvl)
            fh.setFormatter(formatter)
            logger.addHandler(fh)

        # Create a console handler (optional, if you still want console output)
        ch = logging.StreamHandler()
        ch.setLevel(lvl)
        # # Change to WARNING to only see warnings/errors in the terminal
        # ch.setLevel(logging.WARNING)
        # ch.setLevel(logging.INFO)

        # Add formatter to both handlers
        ch.setFormatter(formatter)

        # Add handlers to the logger
        logger.addHandler(ch)

    return logger


def set_logger_from_default(name: str, values_default: dict) -> logging.Logger:

    log_file = None
    if values_default.get('DEFAULT_LOG_TO_FILE'):
        log_file = values_default.get('DEFAULT_LOG_FILE_PATH')

    if values_default.get('DEFAULT_DEBUG'):
        logger = setup_logger(
            name=name,
            level="DEBUG",
            log_formatter=values_default.get('DEFAULT_LOG_FORMAT'),
            log_file=log_file,
        )

    else:
        logger = setup_logger(
            name=name,
            # level=logging.DEBUG,
            log_formatter=values_default.get('DEFAULT_LOG_FORMAT'),
            log_file=log_file,
        )

    return logger


def set_logger_from_config(name: str, config: object) -> logging.Logger:

    log_file = None
    log_file_append = True

    if config.log_to_file:
        log_file = config.log_file_path
        log_file_append = config.log_file_append_mode

    if config.debug:
        logger = setup_logger(
            name=name,
            level="DEBUG",
            log_formatter=config.log_format,
            log_file=log_file,
            log_file_append=log_file_append,
        )

    else:
        logger = setup_logger(
            name=name,
            # level="DEBUG",
            log_formatter=config.log_format,
            log_file=log_file,
            log_file_append=log_file_append,
        )

    return logger


def set_logger_from_dict(name: str, dict_values: dict) -> logging.Logger:

    log_file = None
    log_file_append = True
    if dict_values.get('log_to_file'):
        log_file = dict_values.get('log_file_path')
        log_file_append = dict_values.get('log_file_append_mode')

    if dict_values.get('debug'):
        logger = setup_logger(
            name=name,
            level="DEBUG",
            log_formatter=dict_values.get('log_format'),
            log_file=log_file,
            log_file_append=log_file_append,
        )

    else:
        logger = setup_logger(
            name=name,
            # level="DEBUG",
            log_formatter=dict_values.get('log_format'),
            log_file=log_file,
            log_file_append=log_file_append,
        )

    return logger