"""
Configuracion centralizada del scheduler con APScheduler.
Gestiona el ciclo de vida de todas las tareas programadas.
"""
import logging
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.executors.asyncio import AsyncIOExecutor

logger = logging.getLogger(__name__)

# Configuracion del scheduler
jobstores = {
    'default': MemoryJobStore()
}

executors = {
    'default': AsyncIOExecutor()
}

job_defaults = {
    'coalesce': True,  # Si se perdieron ejecuciones, ejecutar solo una vez
    'max_instances': 1,  # Maximo una instancia de cada job al mismo tiempo
    'misfire_grace_time': 30  # Segundos de tolerancia para ejecuciones perdidas
}

# Instancia global del scheduler
scheduler = AsyncIOScheduler(
    jobstores=jobstores,
    executors=executors,
    job_defaults=job_defaults,
    timezone='America/Guayaquil'  # Ajusta a tu zona horaria
)


def register_jobs():
    """
    Registra todos los jobs en el scheduler.
    Importa y agrega cada job definido en tasks/jobs/
    """
    from tasks.jobs.sync_data import sync_data_job

    # Job de sincronizacion: cada 1 minuto
    scheduler.add_job(
        sync_data_job,
        trigger='interval',
        minutes=1,
        id='sync_data_job',
        name='Sincronizacion de datos',
        replace_existing=True
    )

    logger.info("📋 Jobs registrados en el scheduler")


def start_scheduler():
    """Inicia el scheduler con todos los jobs registrados."""
    if scheduler.running:
        logger.warning("⚠️ El scheduler ya esta corriendo")
        return

    register_jobs()
    scheduler.start()
    logger.info("⏰ Scheduler iniciado correctamente")

    # Listar jobs activos
    jobs = scheduler.get_jobs()
    for job in jobs:
        logger.info(f"   - {job.name} (ID: {job.id}) -> Siguiente: {job.next_run_time}")


def stop_scheduler():
    """Detiene el scheduler de forma segura."""
    if scheduler.running:
        scheduler.shutdown(wait=True)
        logger.info("🛑 Scheduler detenido correctamente")
    else:
        logger.warning("⚠️ El scheduler no estaba corriendo")
