"""
schemas.py
-----------
Pydantic models used for request/response validation. This is the app's
main input-validation layer (required-field checks, type coercion, length
limits, email format) — the first line of defense against malformed or
malicious input, alongside the ORM's use of parameterized queries (which
prevents SQL injection by construction).
"""

from datetime import date, datetime
from typing import Dict, List, Optional

from pydantic import BaseModel, EmailStr, Field, field_validator


# ---------------------------------------------------------------------------
# Auth
# ---------------------------------------------------------------------------
class UserRegister(BaseModel):
    email: EmailStr
    password: str = Field(..., min_length=10, max_length=128)
    display_name: Optional[str] = Field(None, max_length=100)
    date_of_birth: date

    @field_validator("password")
    @classmethod
    def password_complexity(cls, v: str) -> str:
        if not any(c.isdigit() for c in v):
            raise ValueError("Password must contain at least one digit")
        if not any(c.isalpha() for c in v):
            raise ValueError("Password must contain at least one letter")
        return v


class UserLogin(BaseModel):
    email: EmailStr
    password: str = Field(..., min_length=1, max_length=128)


class Token(BaseModel):
    access_token: str
    token_type: str = "bearer"


class UserProfile(BaseModel):
    id: int
    participant_code: str
    email: EmailStr
    display_name: Optional[str]
    is_email_verified: bool
    consent_given_at: Optional[datetime]
    created_at: datetime

    class Config:
        from_attributes = True


class UserProfileUpdate(BaseModel):
    display_name: Optional[str] = Field(None, max_length=100)


class EmailVerifyRequest(BaseModel):
    token: str = Field(..., min_length=10, max_length=255)


# ---------------------------------------------------------------------------
# Chat
# ---------------------------------------------------------------------------
class ChatStartResponse(BaseModel):
    session_uuid: str
    bot_message: str
    stage: str


class ChatMessageRequest(BaseModel):
    session_uuid: str
    message: str = Field(..., min_length=1, max_length=2000)


class ChatMessageResponse(BaseModel):
    bot_message: str
    stage: str
    safety_triggered: bool
    is_complete: bool
    result: Optional[Dict] = None


class MessageOut(BaseModel):
    speaker: str
    content: str
    created_at: datetime

    class Config:
        from_attributes = True


class SessionHistoryResponse(BaseModel):
    session_uuid: str
    stage: str
    started_at: datetime
    completed_at: Optional[datetime]
    messages: List[MessageOut]


# ---------------------------------------------------------------------------
# Dashboard
# ---------------------------------------------------------------------------
class DashboardStats(BaseModel):
    total_participants: int
    total_sessions: int
    completed_sessions: int
    average_depression_score: float
    average_anxiety_score: float
    average_stress_score: float
    average_wellness_score: float
    risk_distribution: Dict[str, Dict[str, int]]  # domain -> {Low/Moderate/High: count}
    sessions_last_7_days: Dict[str, int]           # date string -> count
    sessions_last_12_months: Dict[str, int]        # "YYYY-MM" -> count


# ---------------------------------------------------------------------------
# Feedback
# ---------------------------------------------------------------------------
class FeedbackCreate(BaseModel):
    session_uuid: Optional[str] = None
    rating: Optional[int] = Field(None, ge=1, le=5)
    comment: Optional[str] = Field(None, max_length=2000)
