"""Shared startup and shutdown routines for IOC Checker services."""

from __future__ import annotations

import asyncio
import logging

from .config import settings
from .database import init_db
from .worker import start_workers

logger = logging.getLogger(__name__)

_worker_tasks: list[asyncio.Task[None]] = []


async def bootstrap() -> None:
    """Инициализировать инфраструктуру приложения, общую для всех интерфейсов."""

    if _worker_tasks:
        logger.debug(
            "Запрошена инициализация, но уже активны %d воркер(ов)", len(_worker_tasks)
        )
        return

    logger.info("Инициализируем базу данных")
    await init_db()
    logger.info("Запускаем %s воркер(ов)", settings.worker_count)
    workers = start_workers(settings.worker_count)
    _worker_tasks.extend(workers)
    logger.debug("Инициализация завершена, активных воркеров: %d", len(_worker_tasks))


async def shutdown() -> None:
    """Аккуратно остановить работающие фоновые воркеры."""

    if not _worker_tasks:
        logger.debug("Запрошена остановка, но активных воркеров нет")
        return

    logger.info("Останавливаем %d воркер(ов)", len(_worker_tasks))
    for task in _worker_tasks:
        task.cancel()
    results = await asyncio.gather(*_worker_tasks, return_exceptions=True)
    for task, result in zip(_worker_tasks, results):
        if isinstance(result, asyncio.CancelledError):
            logger.debug("Задача воркера %s отменена", task.get_name())
        elif isinstance(result, Exception):  # pragma: no cover - defensive logging
            logger.warning(
                "Задача воркера %s завершилась с ошибкой: %s", task.get_name(), result
            )
        else:  # pragma: no cover - should not happen
            logger.debug(
                "Задача воркера %s завершена с результатом %s", task.get_name(), result
            )
    _worker_tasks.clear()
    logger.debug("Остановка завершена")
