# -*- coding: utf-8 -*-

import os
import inspect

try:
    import xbmc
    import xbmcaddon
    HAS_XBMC = True
    _LOG_LEVELS = {
        'DEBUG': xbmc.LOGDEBUG,
        'INFO': xbmc.LOGINFO,
        'WARNING': xbmc.LOGWARNING,
        'ERROR': xbmc.LOGERROR,
        'FATAL': xbmc.LOGFATAL
    }
except ImportError:
    HAS_XBMC = False
    _LOG_LEVELS = {
        'DEBUG': 0, 'INFO': 1, 'WARNING': 2, 'ERROR': 3, 'FATAL': 4
    }

# ID addonu, které bude použito jako součást prefixu.
ADDON_ID = "SM3" 

class Logger:
    """
    Třída Loggeru, která zapouzdřuje logovací logiku pro konkrétní modul.
    """
    def __init__(self, module_name):
        self.module_name = module_name

    def __call__(self, msg, level='INFO', **kwargs):
        """
        Zajistí, že instance Loggeru je volatelná jako funkce (pro zpětnou kompatibilitu).
        """
        self._log(msg, level, **kwargs)

    def _log(self, msg, level_str, **kwargs):
        try:
            # Optimalizace: Pro ignorované úrovně ihned vyskoč (ušetří i formátování exc_info)
            if HAS_XBMC and level_str.upper() not in ('ERROR', 'FATAL'):
                try:
                    # Inicializujeme Addon() až uvnitř metody, zabrání to RuntimeError 'No valid addon id'
                    # při startu v cizím/interním vlákně.
                    addon = xbmcaddon.Addon('plugin.video.mmirousek_v3')
                    if addon.getSetting('enable_detailed_logging') != 'true':
                        return
                except Exception:
                    pass # Bezpečný fallback, prostě loguj dál

            exc_info = kwargs.get('exc_info')
            if exc_info:
                import traceback
                msg = f"{msg}\n{traceback.format_exc()}"

            log_msg = f"{ADDON_ID}-{self.module_name}: {msg}"
            
            if HAS_XBMC:
                kodi_level = _LOG_LEVELS.get(level_str.upper(), xbmc.LOGINFO)
                xbmc.log(log_msg, level=kodi_level)
            else:
                print(f"[{level_str.upper()}] {log_msg}")
        except Exception as e:
            if HAS_XBMC:
                xbmc.log(f"SM2-log_utils: CRITICAL-ERROR in logging utility: {e}", level=xbmc.LOGERROR)
                xbmc.log(f"SM2-log_utils: Original message from {self.module_name}: {msg}", level=xbmc.LOGERROR)
            else:
                print(f"[ERROR] SM2-log_utils: CRITICAL-ERROR: {e} | Original msg: {msg}")

    def debug(self, msg, *args, **kwargs):
        self._log(msg, 'DEBUG', **kwargs)

    def info(self, msg, *args, **kwargs):
        self._log(msg, 'INFO', **kwargs)

    def warning(self, msg, *args, **kwargs):
        self._log(msg, 'WARNING', **kwargs)

    def error(self, msg, *args, **kwargs):
        self._log(msg, 'ERROR', **kwargs)

    def fatal(self, msg, *args, **kwargs):
        self._log(msg, 'FATAL', **kwargs)

_loggers = {}

def get_logger():
    """
    Vytvoří nebo vrátí existující instanci Loggeru pro volající modul.
    """
    # Získání frame volající funkce pro určení názvu modulu
    try:
        caller_frame = inspect.stack()[1]
        module_path = caller_frame.filename
        module_name = os.path.splitext(os.path.basename(module_path))[0]
    except Exception:
        module_name = "unknown"

    if module_name not in _loggers:
        _loggers[module_name] = Logger(module_name)
    
    return _loggers[module_name]

# Ponechání staré funkce pro zpětnou kompatibilitu, pokud by byla někde použita.
# Nový kód by měl používat `get_logger()`.
def log(msg, level='INFO'):
    """
    Legacy logovací funkce. Nový kód by měl používat get_logger().
    """
    try:
        if HAS_XBMC and level.upper() not in ('ERROR', 'FATAL'):
            try:
                addon = xbmcaddon.Addon('plugin.video.mmirousek_v3')
                if addon.getSetting('enable_detailed_logging') != 'true':
                    return
            except Exception:
                pass

        caller_frame = inspect.stack()[1]
        module_path = caller_frame.filename
        module_name = os.path.splitext(os.path.basename(module_path))[0]
        
        log_msg = f"{ADDON_ID}-{module_name}: {msg}"
        
        if HAS_XBMC:
            kodi_level = _LOG_LEVELS.get(level.upper(), xbmc.LOGINFO)
            xbmc.log(log_msg, level=kodi_level)
        else:
            print(f"[{level.upper()}] {log_msg}")
    except Exception as e:
        if HAS_XBMC:
            xbmc.log(f"SM2-log_utils: CRITICAL-ERROR in legacy logging: {e}", level=xbmc.LOGERROR)
            xbmc.log(f"SM2-log_utils: Original legacy message: {msg}", level=xbmc.LOGERROR)
        else:
            print(f"[ERROR] SM2-log_utils legacy log fail: {e}")
