import logging
import os

COLORS = {
    'GREEN': '\033[92m', 'GREEN_BG': '\033[102m',
    'YELLOW': '\033[93m', 'YELLOW_BG': '\033[103m',
    'RED': '\033[91m', 'RED_BG': '\033[101m',
    'RESET': '\033[0m', 'BOLD': '\033[1m', 'UNDERLINE': '\033[4m',
    'BLUE': '\033[94m', 'CYAN': '\033[96m',
}


def color_message(message, color):
    return f'{COLORS[color]}{message}{COLORS["RESET"]}'


class Logger:
    def __init__(self):
        self.log_level = os.getenv('LOG_LEVEL', 'INFO')
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(self.log_level)

        # Define the log format
        log_format = '%(levelname)s: %(asctime)s - %(message)s'
        formatter = logging.Formatter(log_format)

        # Create a console handler
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(formatter)

        # Remove all handlers associated with the logger object
        for handler in self.logger.handlers[:]:
            self.logger.removeHandler(handler)

        # Add the custom console handler to the logger
        self.logger.addHandler(console_handler)

        self.logger.propagate = False

        # Suppress excessive logging from specific libraries
        for lib in ('boto', 'boto3', 'botocore', 's3transfer', 'urllib3'):
            logging.getLogger(lib).setLevel(logging.WARNING)

    def trace_back(self, tb):
        self.error(f'{str(tb.tb_frame).split(",")[-1][6:-1]}, {tb.tb_lineno}')
        if tb.tb_next:
            self.trace_back(tb.tb_next)

    def info(self, message):
        self.logger.info(message)

    def info_green(self, message):
        self.logger.info(color_message(message, 'GREEN'))

    def info_green_bg(self, message):
        self.logger.info(color_message(message, 'GREEN_BG'))

    def info_yellow(self, message):
        self.logger.info(color_message(message, 'YELLOW'))

    def info_red(self, message):
        self.logger.info(color_message(message, 'RED'))

    def info_red_bg(self, message):
        self.logger.info(color_message(message, 'RED_BG'))

    def warning(self, message):
        self.logger.warning(color_message(message, 'YELLOW'))

    def error(self, message):
        self.logger.error(color_message(message, 'RED'))

    def error_red_bg(self, message):
        self.logger.error(color_message(message, 'RED_BG'))

    def debug(self, message):
        self.logger.debug(message)

    def debug_green(self, message):
        self.logger.debug(color_message(message, 'GREEN'))

    def debug_green_bg(self, message):
        self.logger.debug(color_message(message, 'GREEN_BG'))

    def debug_yellow(self, message):
        self.logger.debug(color_message(message, 'YELLOW'))

    def debug_red(self, message):
        self.logger.debug(color_message(message, 'RED'))

    def debug_red_bg(self, message):
        self.logger.debug(color_message(message, 'RED_BG'))

    def critical(self, message):
        self.logger.critical(color_message(message, 'RED_BG'))

    def critical_red(self, message):
        self.logger.critical(color_message(message, 'RED'))

    def info_blue(self, message):
        self.logger.info(color_message(message, 'BLUE'))

    def info_cyan(self, message):
        self.logger.info(color_message(message, 'CYAN'))

    def info_bold(self, message):
        self.logger.info(color_message(message, 'BOLD'))

    def info_underline(self, message):
        self.logger.info(color_message(message, 'UNDERLINE'))


logger = Logger()

# Example usage
# logger.info("message")
# logger.info_green("message")
# logger.info_green_bg("message")
# logger.info_yellow("message")
# logger.info_red("message")
# logger.info_red_bg("message")
# logger.warning("message")
# logger.error("message")
# logger.error_red_bg("message")
# logger.debug("message")
# logger.debug_green("message")
# logger.debug_green_bg("message")
# logger.debug_yellow("message")
# logger.debug_red("message")
# logger.debug_red_bg("message")
# logger.critical("message")
# logger.critical_red("message")
# logger.info_blue("message")
# logger.info_cyan("message")
# logger.info_bold("message")
# logger.info_underline("message")

