"""模板库端点的请求/响应 schema（F3 / 契约 §F3）。

snake_case；前端经 OpenAPI 生成 TS 类型消费。改字段 → 前端必须 `pnpm gen:api`。
单用户本地版：作者保存/复用提示词模板，可一键填入生成器的 brief/text。
`title`/`body` 非空（先 strip 再 `min_length=1`，纯空白 → 422）。`category`/`tool_key` 可选。
"""

from __future__ import annotations

import uuid
from typing import Annotated

from pydantic import BaseModel, Field, StringConstraints

# 先去首尾空白再校验长度：纯空白（"   "）strip 后为空 → min_length=1 不满足 → 422。
NonBlankStr = Annotated[str, StringConstraints(strip_whitespace=True, min_length=1)]


class TemplateCreateRequest(BaseModel):
    """POST /templates：新建一条提示词模板。"""

    title: NonBlankStr = Field(description="模板标题（非空，纯空白 → 422）")
    body: NonBlankStr = Field(description="模板正文（非空，一键填入生成器的 brief/text）")
    category: str | None = Field(default=None, description="可选分类")
    tool_key: str | None = Field(default=None, description="可选关联生成器（NULL=通用）")


class TemplateResponse(BaseModel):
    """模板视图（列出/创建后回显；snake_case）。"""

    id: uuid.UUID
    title: str
    body: str
    category: str | None = None
    tool_key: str | None = None
