"""
自定义异常类
"""
from fastapi import HTTPException, status


class BaseAPIException(HTTPException):
    """基础API异常"""
    def __init__(self, status_code: int, detail: str, error_code: str = None):
        super().__init__(status_code=status_code, detail=detail)
        self.error_code = error_code


class ValidationError(BaseAPIException):
    """验证错误"""
    def __init__(self, detail: str):
        super().__init__(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=detail,
            error_code="VALIDATION_ERROR"
        )


class NotFoundError(BaseAPIException):
    """资源未找到错误"""
    def __init__(self, resource: str, resource_id: str = None):
        detail = f"{resource}不存在"
        if resource_id:
            detail += f": {resource_id}"
        super().__init__(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=detail,
            error_code="NOT_FOUND"
        )


class UnauthorizedError(BaseAPIException):
    """未授权错误"""
    def __init__(self, detail: str = "未授权访问"):
        super().__init__(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail=detail,
            error_code="UNAUTHORIZED"
        )


class ForbiddenError(BaseAPIException):
    """禁止访问错误"""
    def __init__(self, detail: str = "无权访问此资源"):
        super().__init__(
            status_code=status.HTTP_403_FORBIDDEN,
            detail=detail,
            error_code="FORBIDDEN"
        )


class ConflictError(BaseAPIException):
    """资源冲突错误"""
    def __init__(self, detail: str):
        super().__init__(
            status_code=status.HTTP_409_CONFLICT,
            detail=detail,
            error_code="CONFLICT"
        )


class InternalServerError(BaseAPIException):
    """内部服务器错误"""
    def __init__(self, detail: str = "服务器内部错误"):
        super().__init__(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=detail,
            error_code="INTERNAL_ERROR"
        )


class WorkflowExecutionError(BaseAPIException):
    """工作流执行错误"""
    def __init__(self, detail: str, node_id: str = None):
        if node_id:
            detail = f"节点 {node_id} 执行失败: {detail}"
        super().__init__(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=detail,
            error_code="WORKFLOW_EXECUTION_ERROR"
        )
