from __future__ import annotations

from app.intent.intent_analyzer import IntentAnalyzer
from app.intent.tier2_classifier import (
    Tier2Classifier,
    clear_tier2_cache,
    get_cached_tier2,
    set_cached_tier2,
)
from app.core.config import settings
from app.models.intent import IntentResult, QueryIntent


class IntentPipeline:
    """Orchestrates Tier-1 rules and optional Tier-2 LLM classification."""

    def __init__(
        self,
        tier1: IntentAnalyzer | None = None,
        tier2: Tier2Classifier | None = None,
    ):
        self._tier1 = tier1 or IntentAnalyzer()
        self._tier2 = tier2 or Tier2Classifier()

    async def resolve_intent(
        self,
        question: str,
        *,
        intent_override: str | None = None,
    ) -> IntentResult:
        if intent_override:
            try:
                override = QueryIntent(intent_override)
            except ValueError as exc:
                raise ValueError("invalid intent_override") from exc
            base = self._tier1.analyze(question)
            return base.model_copy(
                update={
                    "type": override,
                    "confidence": 1.0,
                    "tier": "tier1",
                }
            )

        tier1_result = self._tier1.analyze(question)

        if not self._should_run_tier2(tier1_result):
            return tier1_result

        cached = get_cached_tier2(question)
        if cached is not None:
            return cached

        tier2_result = await self._tier2.classify(question)
        if tier2_result is None:
            return tier1_result

        set_cached_tier2(question, tier2_result)
        return tier2_result

    def _should_run_tier2(self, result: IntentResult) -> bool:
        if settings.INTENT_CLASSIFIER != "tier1+tier2":
            return False
        return result.confidence < settings.TIER1_CONFIDENCE_THRESHOLD
