import logging
from logging.handlers import TimedRotatingFileHandler
import os
from datetime import datetime
import asyncio

# Crear carpeta de logs
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)

# Nombre con fecha
today = datetime.now().strftime("%Y-%m-%d")

# Tamaño máximo en bytes (15 MB)
MAX_LOG_SIZE = 15 * 1024 * 1024

def get_timed_rotating_handler(filename: str, level: int):
    file_path = os.path.join(log_dir, f"{filename}_{today}.log")

    handler = TimedRotatingFileHandler(
        file_path,
        when="midnight",         # Rota a la medianoche
        backupCount=30,          # Guarda últimos 30 archivos
        encoding="utf-8",
        delay=True
    )
    handler.setLevel(level)

    # Custom formatter
    formatter = logging.Formatter(
        '[%(asctime)s] [%(levelname)s] %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    handler.setFormatter(formatter)

    # Check size manually and rotate if needed
    def emit_with_size_check(record):
        if os.path.exists(file_path) and os.path.getsize(file_path) >= MAX_LOG_SIZE:
            handler.doRollover()
        handler._original_emit(record)

    handler._original_emit = handler.emit
    handler.emit = emit_with_size_check

    return handler

# Logger base
logger = logging.getLogger("api_monitor")
logger.setLevel(logging.DEBUG)  # Puedes cambiarlo a INFO en producción
logger.propagate = False

# Handlers
info_handler = get_timed_rotating_handler("info", logging.INFO)
error_handler = get_timed_rotating_handler("error", logging.ERROR)

# Añadir handlers
logger.addHandler(info_handler)
logger.addHandler(error_handler)


async def log_async(level: str, message: str):
    """
    Llama al logger de forma asincrónica.
    Ejemplo: await log_async("info", "Mensaje")
    """
    def _log():
        if level.lower() == "info":
            logger.info(message)
        elif level.lower() == "error":
            logger.error(message)
        elif level.lower() == "debug":
            logger.debug(message)
        elif level.lower() == "warning":
            logger.warning(message)
        else:
            logger.info(message)

    loop = asyncio.get_event_loop()
    await loop.run_in_executor(None, _log)