from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.interval import IntervalTrigger
from contextlib import asynccontextmanager
from utils import logger

# Глобальный планировщик
scheduler = AsyncIOScheduler()

# ID нашей задачи
JOB_ID = "update_signings"


async def update_signings_job():
    """Задача обновления статусов подписей"""
    try:
        from db.schemas.signings import Signing

        await Signing.updateStatuses()
        logger.info("APScheduler: задача обновления статусов выполнена")
    except Exception as e:
        logger.error(f"APScheduler ошибка: {e}", exc_info=True)


def init_scheduler():
    """Инициализация планировщика (добавление задач)"""
    if not scheduler.running:
        # Добавляем задачу при инициализации
        _add_job_to_scheduler()
        logger.info("APScheduler задачи добавлены")


def _add_job_to_scheduler():
    """Внутренняя функция добавления задачи"""
    scheduler.add_job(
        update_signings_job,
        trigger=IntervalTrigger(seconds=60),
        id=JOB_ID,
        replace_existing=True,
    )


@asynccontextmanager
async def scheduler_lifespan():
    """Lifespan только для планировщика"""
    # Startup
    if not scheduler.running:
        scheduler.start()
        logger.info("APScheduler запущен")

    yield

    # Shutdown
    if scheduler.running:
        scheduler.shutdown()
        logger.info("APScheduler остановлен")

    logger.info("APScheduler завершен")


# ========== ГЛОБАЛЬНОЕ УПРАВЛЕНИЕ ==========


def enable_job():
    """Полностью включить задачу (добавить в планировщик)"""
    try:
        # Проверяем, есть ли уже задача
        existing_job = scheduler.get_job(JOB_ID)

        if not existing_job:
            # Добавляем задачу
            _add_job_to_scheduler()
            logger.info("✅ Задача обновления статусов ДОБАВЛЕНА в планировщик")
            return True
        else:
            logger.info("ℹ️ Задача обновления статусов уже существует в планировщике")
            return True
    except Exception as e:
        logger.error(f"❌ Ошибка при включении задачи: {e}")
        return False


def disable_job():
    """Полностью выключить задачу (удалить из планировщика)"""
    try:
        # Проверяем, есть ли задача
        existing_job = scheduler.get_job(JOB_ID)

        if existing_job:
            # Удаляем задачу
            scheduler.remove_job(JOB_ID)
            logger.info("❌ Задача обновления статусов УДАЛЕНА из планировщика")
            return True
        else:
            logger.info("ℹ️ Задача обновления статусов и так отсутствует в планировщике")
            return True
    except Exception as e:
        logger.error(f"❌ Ошибка при выключении задачи: {e}")
        return False


def toggle_job():
    """Переключить состояние задачи (добавить/удалить)"""
    existing_job = scheduler.get_job(JOB_ID)

    if existing_job:
        return disable_job()
    else:
        return enable_job()


def is_job_enabled() -> bool:
    """Проверить, есть ли задача в планировщике"""
    return scheduler.get_job(JOB_ID) is not None


def get_job_info():
    """Получить информацию о задаче"""
    job = scheduler.get_job(JOB_ID)
    if job:
        return {
            "enabled": True,
            "id": job.id,
            "next_run": str(job.next_run_time) if job.next_run_time else None,
            "trigger": str(job.trigger),
        }
    else:
        return {"enabled": False, "id": JOB_ID, "next_run": None}
