import time
from core.blackboard import Blackboard
from core.salience import SalienceEngine


class Scheduler:
    """
    The Governor. Enforces budgets, timeouts, and triggers escalation.
    """

    def __init__(self, blackboard: Blackboard, engine: SalienceEngine):
        self.bb = blackboard
        self.engine = engine
        self.limits = {
            "max_cost": 5.0,  # USD
            "max_tokens": 100000,
            "max_steps": 50,
            "timeout_sec": 300,
            "max_retries": 3,
        }
        self.halted = False

    def check_constraints(self) -> bool:
        """
        Returns True if system should continue, False if hard stop.
        """
        metrics = self.bb.read("metrics")

        # 1. Resource Depletion
        if metrics["cost_total"] >= self.limits["max_cost"]:
            self.stop("BUDGET_EXCEEDED")
            return False

        if metrics["tokens_spent"] >= self.limits["max_tokens"]:
            self.stop("TOKEN_LIMIT_REACHED")
            return False

        # 2. Timeouts
        elapsed = time.time() - metrics["start_time"]
        if elapsed >= self.limits["timeout_sec"]:
            self.stop("TIMEOUT")
            return False

        # 3. Infinite Loop / Stalling
        if self.bb.read("step_index") >= self.limits["max_steps"]:
            self.stop("MAX_STEPS_REACHED")
            return False

        return True

    def should_escalate(self, current_salience: float) -> bool:
        """
        Decision logic for Hybrid -> Powerhouse escalation.
        """
        metrics = self.bb.read("metrics")
        uncertainty = self.engine.estimate_uncertainty(
            current_salience, metrics["cost_total"]
        )

        # Escalation criteria:
        # - High uncertainty
        # - High error count
        # - Critical task + low salience
        if uncertainty > 0.7 or metrics["errors"] > 2:
            return True
        return False

    def stop(self, reason: str):
        self.halted = True
        self.bb.write("state", "HALTED", "SCHEDULER")
        print(f"[!] SCHEDULER: System halted. Reason: {reason}")
