#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：dependency.py
模块描述：依赖管理相关 Pydantic 模式定义

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

from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field, ConfigDict


class DependencyDefinition(BaseModel):
    """
    依赖定义模式

    定义单个依赖关系。

    Attributes:
        depends_on_case_id (str): 被依赖的用例ID
        dependency_type (str): 依赖类型 (hard=强依赖/soft=弱依赖)
        order (int): 依赖顺序
    """

    depends_on_case_id: str = Field(..., description="被依赖的用例ID")
    dependency_type: str = Field(
        default="hard",
        description="依赖类型: hard(强依赖)/soft(弱依赖)"
    )
    order: int = Field(default=0, ge=0, description="依赖顺序")


class SetDependenciesRequest(BaseModel):
    """
    设置依赖请求模式

    用于设置用例的依赖关系。
    """

    dependencies: List[DependencyDefinition] = Field(
        default_factory=list,
        description="依赖定义列表"
    )


class DependencyResponse(BaseModel):
    """
    依赖关系响应模式

    用于返回依赖关系数据给客户端。
    """

    model_config = ConfigDict(from_attributes=True)

    id: str = Field(..., description="依赖关系ID")
    case_id: str = Field(..., description="用例ID")
    depends_on_case_id: str = Field(..., description="被依赖的用例ID")
    dependency_type: str = Field(default="hard", description="依赖类型")
    order: int = Field(default=0, description="依赖顺序")
    created_at: Optional[datetime] = Field(None, description="创建时间")


class ValidateDependenciesResponse(BaseModel):
    """
    验证依赖响应模式

    用于返回依赖验证结果。
    """

    valid: bool = Field(..., description="依赖关系是否有效")
    cycle: Optional[List[str]] = Field(None, description="检测到的循环路径")
    message: str = Field(..., description="验证消息")


class ExecutionOrderResponse(BaseModel):
    """
    执行顺序响应模式

    用于返回拓扑排序后的执行顺序。
    """

    ordered_case_ids: List[str] = Field(..., description="排序后的用例ID列表")
    has_cycle: bool = Field(..., description="是否存在循环依赖")
    cycle_path: Optional[List[str]] = Field(None, description="循环路径")


class DependencyStatusResponse(BaseModel):
    """
    依赖状态响应模式

    用于返回用例的依赖状态检查结果。
    """

    can_execute: bool = Field(..., description="是否可以执行")
    status: str = Field(..., description="依赖状态: ok/blocked/skipped")
    failed_dependencies: List[str] = Field(default_factory=list, description="失败的依赖用例ID列表")
    message: str = Field(..., description="状态消息")
