from __future__ import annotations

from app.models.intent import IntentResult, QueryIntent

_TECHNICAL_TERMS = (
    "authentication",
    "authorization",
    "middleware",
    "oauth",
    "jwt",
    "login",
)
_AUTH_TERMS = ("authentication", "auth", "authorize", "authorization", "login")
_PRODUCT_TOKENS = ("crawl", "crawler", "crawl-api", "crawl api")


def _contains_any(text: str, terms: tuple[str, ...]) -> bool:
    return any(term in text for term in terms)


def _rewrite_auth_question(question: str) -> str | None:
    lower = question.lower()
    if not _contains_any(lower, _AUTH_TERMS):
        return None
    if not _contains_any(lower, _PRODUCT_TOKENS):
        return None
    return (
        "AuthProfile AuthContext site API authentication provider "
        + question.strip()
    )


def _rewrite_technical_question(question: str, intent: IntentResult) -> str | None:
    lower = question.lower()
    if intent.type not in {QueryIntent.ARCHITECTURE, QueryIntent.GENERAL, QueryIntent.MIXED}:
        return None
    if not _contains_any(lower, _TECHNICAL_TERMS):
        return None
    if _contains_any(lower, _PRODUCT_TOKENS) and _contains_any(lower, _AUTH_TERMS):
        return _rewrite_auth_question(question)
    return None


_OVERVIEW_HINTS = (
    "README overview architecture main modules services repository functionality features",
)


def _rewrite_overview_question(question: str, intent: IntentResult) -> str | None:
    if intent.type not in {QueryIntent.ARCHITECTURE, QueryIntent.GENERAL}:
        return None
    lower = question.lower()
    overview_terms = (
        "functionality",
        "functionalities",
        "features",
        "what does this repo",
        "what is this repo",
        "capabilities",
        "overview",
        "what can this",
    )
    if not any(term in lower for term in overview_terms):
        return None
    return f"{question.strip()} {_OVERVIEW_HINTS[0]}"


def apply_query_rewrite(intent: IntentResult, question: str) -> str:
    """Return retrieval query text; Tier-2 rewrite when present, else heuristics."""
    if intent.rewritten_query and intent.rewritten_query.strip():
        return intent.rewritten_query.strip()

    trimmed = question.strip()
    if not trimmed:
        return trimmed

    auth_rewrite = _rewrite_auth_question(trimmed)
    if auth_rewrite:
        return auth_rewrite

    technical_rewrite = _rewrite_technical_question(trimmed, intent)
    if technical_rewrite:
        return technical_rewrite

    overview_rewrite = _rewrite_overview_question(trimmed, intent)
    if overview_rewrite:
        return overview_rewrite

    return trimmed
