import asyncio, logging
from telegram import Bot
from worker import UserWorker
from database import get_all_active_sessions, set_session_status

log = logging.getLogger(__name__)

class WorkerManager:
    def __init__(self, bot: Bot, vapid_private="", vapid_email=""):
        self.bot = bot
        self.vapid_private = vapid_private
        self.vapid_email = vapid_email
        self.workers: dict[int, UserWorker] = {}

    async def start_all(self):
        sessions = await get_all_active_sessions()
        for s in sessions:
            await self.start_worker(
                user_id=s["user_id"], telegram_chat_id=s.get("telegram_chat_id"),
                session_json=s["session_json"], poll_interval=s.get("poll_interval", 300),
                mute_filter=bool(s.get("mute_filter", 1)),
                notify_telegram=bool(s.get("notify_telegram", 0)),
                notify_webpush=bool(s.get("notify_webpush", 0)),
                push_subscription=s.get("push_subscription"),
            )
        log.info(f"Запущено {len(self.workers)} воркеров")

    async def start_worker(self, user_id, telegram_chat_id, session_json,
                           poll_interval=300, mute_filter=True,
                           notify_telegram=False, notify_webpush=False,
                           push_subscription=None):
        if user_id in self.workers:
            self.workers[user_id].stop()
        w = UserWorker(user_id=user_id, telegram_chat_id=telegram_chat_id,
            session_json=session_json, bot=self.bot, poll_interval=poll_interval,
            mute_filter=mute_filter, notify_telegram=notify_telegram,
            notify_webpush=notify_webpush, push_subscription=push_subscription,
            vapid_private=self.vapid_private, vapid_email=self.vapid_email,
            on_session_expired=self.on_session_expired)
        self.workers[user_id] = w
        w.start()

    def stop_worker(self, user_id):
        if user_id in self.workers:
            self.workers[user_id].stop()
            del self.workers[user_id]

    def get_status(self, user_id) -> str:
        return "active" if user_id in self.workers else "stopped"

    async def on_session_expired(self, user_id):
        self.stop_worker(user_id)
        await set_session_status(user_id, "expired")
