"""API 端点共享的小型业务数据模型。"""

from typing import Any, Dict, Optional, Union

from pydantic import BaseModel, Field, RootModel
from typing_extensions import TypeAliasType


JsonData = TypeAliasType(
    "JsonData",
    Union[
        dict[str, "JsonData"],
        list["JsonData"],
        str,
        int,
        float,
        bool,
        None,
    ],
)
"""可递归序列化的 JSON 数据；OpenAPI 会展示每一种合法 JSON 结构。"""


class JsonObject(RootModel[dict[str, JsonData]]):
    """字段由运行时扩展点决定的 JSON 对象。"""


class JsonObjectList(RootModel[list[JsonObject]]):
    """字段由运行时扩展点决定的 JSON 对象列表。"""


class IdData(BaseModel):
    """创建资源后返回的资源 ID。"""

    id: Optional[int | str] = Field(default=None, description="资源 ID")


class ValueData(BaseModel):
    """单个动态配置值。"""

    value: JsonData = Field(default=None, description="配置值")


class FileNameData(BaseModel):
    """文件操作结果中的文件名。"""

    filename: Optional[str] = Field(default=None, description="文件名")


class NameData(BaseModel):
    """名称计算结果。"""

    name: Optional[str] = Field(default=None, description="名称")


class ServiceClientInfo(BaseModel):
    """可选择的下载器或媒体服务器摘要。"""

    name: Optional[str] = Field(default=None, description="实例名称")
    type: Optional[str] = Field(default=None, description="服务类型")


class ProgressKeyData(BaseModel):
    """异步任务进度查询标识。"""

    progress_key: str = Field(description="进度查询标识")


class BatchProgressKeyData(ProgressKeyData):
    """批量异步任务进度查询标识。"""

    history_ids: list[int] = Field(default_factory=list, description="历史记录 ID 列表")


class TimeData(BaseModel):
    """网络请求耗时。"""

    time: int | float = Field(description="耗时毫秒数")


class ManageRequest(BaseModel):
    """通用管理请求：目标标识 + 管理动作 + 透传参数

    用于通知渠道、网盘存储等统一管理能力入口，
    动作与参数的具体语义由目标模块自行解释
    """

    target: str = Field(description="管理目标标识，如渠道名或存储类型")
    action: str = Field(description="管理动作标识")
    params: Dict[str, Any] = Field(default_factory=dict, description="表单与动作参数，透传给目标模块")
