from __future__ import annotations

from typing import Literal, Optional

from pydantic import BaseModel, Field


# 当前阶段仅支持 EN / TC（繁体中文）
Locale = Literal["en", "tc"]


def normalize_locale(locale: str) -> Locale:
    """
    将客户端传入的 locale 归一化为内部枚举（仅 EN / TC）。

    约定：
    - 任何以 "en" 开头的 locale 归一化为 "en"（例如 en、en-US）
    - "tc"/"zh-TW"/"zh-HK" 归一化为 "tc"
    - 其他 locale 视为不支持
    """

    raw = (locale or "").strip()
    if not raw:
        raise ValueError("locale 不能为空（当前仅支持 en/tc）")

    low = raw.lower()
    if low.startswith("en"):
        return "en"
    if low in {"tc", "zh-tw", "zh-hk", "zh_tw", "zh_hk"}:
        return "tc"

    raise ValueError(f"不支持的 locale：{locale!r}（当前仅支持 en/tc）")


ContentStage = Literal["general", "expecting", "parenting", "unknown"]


class ContentProfileDTO(BaseModel):
    """
    推荐模块消费的内容画像（稳定字段契约）。

    注意：
    - text 已按 locale 选择，不允许语言回退（缺语言文本的内容不返回）
    - emotion_score 为 None 表示 general
    - personalization_power 对上统一为 0/0.5/1
    - review_confidence 缺失时兜底 0.7
    """

    content_id: int
    text: str
    stage: ContentStage
    emotion_score: Optional[float] = None

    context_suitability: dict[str, float] = Field(default_factory=dict)
    need_suitability: dict[str, float] = Field(default_factory=dict)

    personalization_power: float
    risk_flags: list[str] = Field(default_factory=list)

    # 可选字段
    author_id: Optional[str] = None
    template_id: Optional[str] = None
    review_confidence: float = 0.7

