"""Периодический статус бота админу в Telegram."""

from __future__ import annotations

import asyncio
import logging

from config import ADMIN_STATS_INTERVAL_MIN, ADMIN_USER_IDS
from app.daily_report import build_daily_report_text
from app.notify import notify_admin

_log = logging.getLogger(__name__)

_stats_task: asyncio.Task | None = None


def _is_parsing_running() -> bool:
    """True, если сейчас идёт активный сеанс парсинга."""
    try:
        from app.user import usermenu

        task = getattr(usermenu, "_global_parsing_task", None)
        return bool(task is not None and not task.done())
    except Exception:
        return False


async def build_admin_stats_text() -> str:
    base = await build_daily_report_text()
    # build_daily_report_text уже содержит очередь SMS
    return base.replace("📑 <b>Дневной отчёт</b>", "📡 <b>Статус бота (админ)</b>", 1)


async def admin_stats_loop() -> None:
    interval_min = int(ADMIN_STATS_INTERVAL_MIN)
    if interval_min <= 0 or not ADMIN_USER_IDS:
        _log.info(
            "Admin stats loop idle (interval=%s admins=%s)",
            interval_min,
            sorted(ADMIN_USER_IDS) if ADMIN_USER_IDS else [],
        )
        while True:
            try:
                await asyncio.sleep(3600)
            except asyncio.CancelledError:
                break
        return

    _log.info(
        "Admin stats loop started (every %s min, only while parsing runs)",
        interval_min,
    )
    await asyncio.sleep(20)
    while True:
        try:
            if not _is_parsing_running():
                _log.debug("Admin stats skip: parsing not running")
            else:
                text = await build_admin_stats_text()
                await notify_admin(text)
        except asyncio.CancelledError:
            break
        except Exception:
            _log.exception("Admin stats tick failed")
        try:
            await asyncio.sleep(interval_min * 60)
        except asyncio.CancelledError:
            break
    _log.info("Admin stats loop stopped")

def start_admin_stats_task() -> asyncio.Task:
    global _stats_task
    if _stats_task is not None and not _stats_task.done():
        return _stats_task
    _stats_task = asyncio.create_task(admin_stats_loop(), name="admin_stats")
    return _stats_task
