from __future__ import annotations

import time
from collections import deque

from scripts.db import fetch_one


class SimpleScheduler:
    def __init__(self, concurrency_limit: int = 1):
        self.concurrency_limit = concurrency_limit
        self.queue = deque()
        self.active = set()

    def enqueue(self, scene_id: str):
        self.queue.append(scene_id)

    def refresh_active_from_db(self):
        row = fetch_one("SELECT COUNT(*) AS cnt FROM tasks WHERE task_status IN ('submitted','processing')")
        return int(row['cnt']) if row else 0

    def can_dispatch(self) -> bool:
        active_count = self.refresh_active_from_db()
        return active_count < self.concurrency_limit and bool(self.queue)

    def dispatch_next(self):
        if not self.can_dispatch():
            return None
        return self.queue.popleft()

    def loop_once(self):
        if self.can_dispatch():
            return self.dispatch_next()
        time.sleep(0.1)
        return None
