"""所見の種類 `tongue_color`（舌色 5 分類＋程度）の値の型（SPEC_02「kinds」）."""

from typing import Literal

from pydantic import BaseModel, ConfigDict, model_validator

TongueColorLabel = Literal["pale", "light_red", "red", "dark_red", "purple"]
TongueColorSeverity = Literal["strong", "mild", "normal"]


class TongueColor(BaseModel):
    """舌色の所見の値（`{"label": ..., "severity": ...}`）．

    slug は TIASJudgeModel の SPEC_01「クラス定義」と同じ．`normal` は `light_red`（淡紅．正常）
    のときだけで，それ以外の舌色は `strong`（あり）または `mild`（ややあり）．

    Attributes:
        label: 舌色（`pale`・`light_red`・`red`・`dark_red`・`purple`）．
        severity: 程度（`strong`・`mild`・`normal`）．
    """

    # 未知のキーは拒否する（綴りの誤りで値が黙って欠けるのを防ぐ）
    model_config = ConfigDict(extra="forbid", frozen=True, strict=True)

    label: TongueColorLabel
    severity: TongueColorSeverity

    @model_validator(mode="after")
    def _normal_only_for_light_red(self) -> "TongueColor":
        if (self.severity == "normal") != (self.label == "light_red"):
            raise ValueError("severity が normal になるのは label が light_red のときだけ")
        return self
