"""
使用者相關的 API schema。

Schema vs Model 的差別:
  - Model(app/models/user.py)是「資料庫長相」,有 password_hash 等敏感欄位
  - Schema(本檔)是「對外 API 長相」,絕對不會把 password_hash 吐出去

對外回應一律用 UserPublic(沒有密碼雜湊),
讓敏感資料無法因為粗心而洩漏到前端。
"""

from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, EmailStr, Field


# ---------- 註冊請求 ----------
class UserRegisterRequest(BaseModel):
    """POST /api/auth/register 的請求 body。"""

    email: EmailStr = Field(..., description="登入用 email,全域唯一")
    password: str = Field(..., min_length=8, max_length=128, description="至少 8 字元")
    display_name: str = Field(..., min_length=1, max_length=100, description="顯示名稱")


# ---------- 更新個人資料 ----------
class UserUpdateRequest(BaseModel):
    """PATCH /api/users/me 的請求 body。

    所有欄位都可選,只更新有傳的欄位。
    """

    display_name: str | None = Field(default=None, min_length=1, max_length=100)
    avatar_url: str | None = Field(default=None, max_length=500)


# ---------- 對外回應(永遠不含密碼)----------
class UserPublic(BaseModel):
    """API 回傳給前端的使用者資料。

    刻意不包含 password_hash,確保即使開發者粗心也不會洩漏。
    """

    model_config = ConfigDict(from_attributes=True)  # 允許從 SQLAlchemy Model 直接轉換

    id: UUID
    # LINE shadow account placeholder 用 *@cooper.local 之類 reserved TLD,
    # EmailStr 嚴格驗證會拒收 → 整個 /api/users response 500。
    # 對外輸出寬鬆成 str(輸入 — UserCreate 那邊 — 還是 EmailStr 嚴格)
    email: str
    display_name: str
    avatar_url: str | None
    role: str
    is_active: bool
    created_at: datetime
