import logging
import asyncio
from typing import Optional

from core.voice import VoiceClient
from core.tiering import TierGate
from .identity import Identity
from .context import ContextManager

logger = logging.getLogger("core.conductor.engine")

class Conductor:
    """
    The Orchestrator.
    Manages Identity, Context, and the Voice/Vision Bridge.
    Tier-aware: capabilities are gated by the agent's product tier.
    """
    def __init__(self, tier: str = "ENTERPRISE"):
        self.tier_gate = TierGate(tier)
        self.identity = Identity(tier=tier)
        self.context = ContextManager()
        self.voice_client = VoiceClient() if self.tier_gate.has("native_voice") else None
        self.is_alive = False

        logger.info(
            f"Conductor initialized: tier={self.tier_gate.tier_name} "
            f"voice={'enabled' if self.voice_client else 'disabled'}"
        )

    async def boot(self):
        """
        System Boot Sequence.
        """
        logger.info("Conductor: BOOT SEQUENCE INITIATED")

        # 1. Load Identity (tier-aware — loads agent definition)
        if not self.identity.load():
            raise RuntimeError("Conductor failed to load Identity.")

        # 2. Inject System Instruction into Voice Client (if voice is enabled)
        sys_prompt = self.identity.get_system_instruction()
        if self.voice_client:
            logger.info("Conductor: Identity Injected into Voice Kernel")
        else:
            logger.info("Conductor: Voice disabled for tier %s", self.tier_gate.tier_name)

        logger.info("Conductor: Identity Injected into Kernel")

        self.is_alive = True
        logger.info(
            "Conductor: ONLINE [tier=%s, capabilities=%d]",
            self.tier_gate.tier_name,
            len(self.tier_gate.get_all_capabilities()),
        )

    async def run(self):
        """
        Main Event Loop.
        """
        if not self.is_alive:
            await self.boot()

        # Start Voice/Vision Bridge (only if tier supports voice)
        if self.voice_client:
            await self.voice_client.start()
        else:
            logger.info("Conductor: Running in text-only mode (no voice at this tier)")

    async def shutdown(self):
        logger.info("Conductor: SHUTTING DOWN")
        if self.voice_client:
            await self.voice_client.stop()
        self.is_alive = False
