"""GameGrip Safety API — Decision Engine

Orchestrates classifiers, policy engine, conversation history, and review queue.
"""

from typing import Optional, List
from datetime import datetime
from models import (
    ModerateRequest, ModerateResponse, CategoryScore,
    Decision, AgeBand, Platform
)
from config import settings
from classifiers import run_classifiers
from policy_engine import policy_engine
from conversation_store import conversation_store
from review_queue import review_queue


def compute_moderation(request: ModerateRequest) -> ModerateResponse:
    """Full moderation pipeline: classify → score → policy → decide → log → queue."""

    # 1. Resolve policy
    policy = policy_engine.get_policy(request.policy_pack)

    # 2. Run enabled classifiers
    category_scores = run_classifiers(
        text=request.text,
        image_url=request.image_url,
        image_b64=request.image_base64,
        enabled_categories=policy.enabled_categories,
    )

    # 3. Compute base risk (sum of category scores)
    base_risk = sum(cs.score for cs in category_scores)
    reasons = [f"{cs.category}({cs.score:.0f})" for cs in category_scores if cs.score > 0]

    # 4. Apply policy engine (age boost, platform mult, escalation rules, thresholds)
    decision, final_risk, policy_reasons = policy_engine.apply_policy(
        base_risk=base_risk,
        category_scores=category_scores,
        policy=policy,
        age_band=request.age_band,
        platform=request.platform,
    )
    reasons.extend(policy_reasons)

    # 5. Conversation history (Phase 2) — add message and check trend
    conv_record = conversation_store.add_message(
        user_id=request.user_id or "anonymous",
        conversation_id=request.conversation_id or f"default_{request.user_id or 'anon'}",
        text=request.text,
        risk_score=final_risk,
        decision=decision,
        platform=request.platform,
    )

    # If risk is rising in conversation, add a warning reason
    if request.conversation_id:
        summary = conversation_store.get_conversation_summary(request.conversation_id)
        if summary and summary.user_risk_trend == "rising":
            reasons.append("trend(rising)")
            final_risk = min(final_risk + 5, 100)  # small trend penalty

    # 6. Review queue (Phase 3) — auto-escalate if review decision
    review_id = None
    if decision == Decision.REVIEW and settings.enable_review_queue:
        preview = request.text or f"[image] {request.image_url or 'base64'}"
        review_id = review_queue.add(
            content_preview=preview,
            original_decision=decision,
            risk_score=final_risk,
            policy_pack=policy.name,
            age_band=request.age_band,
            platform=request.platform,
            category_scores=category_scores,
        )

    reason_str = "; ".join(reasons) if reasons else "clean"

    return ModerateResponse(
        decision=decision,
        risk=final_risk,
        reason=reason_str,
        category_scores=category_scores,
        policy_applied=policy.name,
        age_band=request.age_band,
        platform=request.platform,
        timestamp=datetime.utcnow(),
        review_id=review_id,
    )
