#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：batch.py
模块描述：批量操作相关 Pydantic 模式定义

作者：czj
创建日期：2026-07-12
"""

from typing import List, Dict, Any, Optional
from pydantic import BaseModel, Field


class BatchDeleteRequest(BaseModel):
    """
    批量删除请求模式

    用于批量删除测试用例。
    """

    case_ids: List[str] = Field(
        ...,
        min_length=1,
        description="用例ID列表"
    )


class BatchUpdateRequest(BaseModel):
    """
    批量更新请求模式

    用于批量更新测试用例。

    Attributes:
        case_ids (List[str]): 用例ID列表
        updates (Dict[str, Any]): 更新字段
    """

    case_ids: List[str] = Field(
        ...,
        min_length=1,
        description="用例ID列表"
    )
    updates: Dict[str, Any] = Field(
        ...,
        description="更新字段（支持: status, priority, tags, order, config）"
    )


class BatchCopyRequest(BaseModel):
    """
    批量复制请求模式

    用于批量复制测试用例。

    Attributes:
        case_ids (List[str]): 用例ID列表
        target_module_id (Optional[str]): 目标模块ID，不指定则复制到原模块
    """

    case_ids: List[str] = Field(
        ...,
        min_length=1,
        description="用例ID列表"
    )
    target_module_id: Optional[str] = Field(
        None,
        description="目标模块ID，不指定则复制到原模块"
    )


class BatchAssignTagsRequest(BaseModel):
    """
    批量分配标签请求模式

    用于批量给用例分配标签。
    """

    case_ids: List[str] = Field(
        ...,
        min_length=1,
        description="用例ID列表"
    )
    tag_names: List[str] = Field(
        ...,
        min_length=1,
        description="标签名称列表"
    )


class BatchSetPriorityRequest(BaseModel):
    """
    批量设置优先级请求模式

    用于批量设置用例优先级。
    """

    case_ids: List[str] = Field(
        ...,
        min_length=1,
        description="用例ID列表"
    )
    priority: str = Field(
        ...,
        description="优先级: high/medium/low"
    )


class BatchOperationResponse(BaseModel):
    """
    批量操作响应模式

    用于返回批量操作的结果统计。
    """

    success: int = Field(..., description="成功数量")
    failed: int = Field(..., description="失败数量")
    total: int = Field(..., description="总数量")
    message: Optional[str] = Field(None, description="操作消息")
