"""GameGrip Safety API — Pydantic Models"""

from typing import Optional, Dict, Any, List
from pydantic import BaseModel, Field
from datetime import datetime
from config import AgeBand, Platform, Decision


# ───────────────────────────────────────────────
# Phase 1 — Core Moderation
# ───────────────────────────────────────────────
class ModerateRequest(BaseModel):
    text: Optional[str] = Field(None, description="Text content to evaluate")
    image_url: Optional[str] = Field(None, description="Public URL to an image")
    image_base64: Optional[str] = Field(None, description="Base64-encoded image data")
    age_band: AgeBand = Field(..., description="Age band of the user sending content")
    platform: Platform = Field(Platform.GENERAL, description="Gaming context where content was sent")
    user_id: Optional[str] = Field(None, description="Unique user identifier for conversation tracking")
    conversation_id: Optional[str] = Field(None, description="Conversation/thread identifier")
    policy_pack: Optional[str] = Field(None, description="Policy pack name (defaults to global config)")


class CategoryScore(BaseModel):
    category: str
    score: float = Field(..., ge=0, le=100)
    confidence: float = Field(..., ge=0, le=1)


class ModerateResponse(BaseModel):
    decision: Decision
    risk: int = Field(..., ge=0, le=100)
    reason: str
    category_scores: List[CategoryScore]
    policy_applied: str
    age_band: AgeBand
    platform: Platform
    timestamp: datetime
    review_id: Optional[str] = None  # populated if escalated to review queue
    admin_override: Optional[Dict[str, Any]] = None


# ───────────────────────────────────────────────
# Phase 2 — Conversation History
# ───────────────────────────────────────────────
class MessageRecord(BaseModel):
    message_id: str
    user_id: str
    conversation_id: str
    text: Optional[str]
    timestamp: datetime
    risk_score: int
    decision: Decision
    platform: Platform


class ConversationHistoryResponse(BaseModel):
    conversation_id: str
    messages: List[MessageRecord]
    user_risk_trend: str  # "rising", "stable", "falling"
    average_risk: float
    alert_count: int


# ───────────────────────────────────────────────
# Phase 3 — Admin Override
# ───────────────────────────────────────────────
class AdminOverrideRequest(BaseModel):
    review_id: str
    new_decision: Decision
    reason: str
    admin_id: str


class AdminOverrideResponse(BaseModel):
    review_id: str
    original_decision: Decision
    new_decision: Decision
    admin_id: str
    timestamp: datetime
    applied: bool


# ───────────────────────────────────────────────
# Phase 3 — Review Queue
# ───────────────────────────────────────────────
class ReviewItem(BaseModel):
    review_id: str
    content_preview: str
    original_decision: Decision
    risk_score: int
    policy_pack: str
    age_band: AgeBand
    platform: Platform
    timestamp: datetime
    status: str  # "pending", "reviewed", "escalated"
    assigned_admin: Optional[str] = None
    category_scores: List[CategoryScore]


class ReviewQueueResponse(BaseModel):
    items: List[ReviewItem]
    total_pending: int
    total_reviewed: int


# ───────────────────────────────────────────────
# Policy Pack Management
# ───────────────────────────────────────────────
class PolicyPackListResponse(BaseModel):
    packs: List[Dict[str, Any]]
    default_pack: str


class PolicyPackDetailResponse(BaseModel):
    name: str
    description: str
    config: Dict[str, Any]
