from fastapi import HTTPException, status


class FileTooLargeException(HTTPException):
    """文件过大异常"""
    def __init__(self, file_size: int, max_size: int):
        super().__init__(
            status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
            detail={
                "code": "FILE_TOO_LARGE",
                "message": f"文件大小 {file_size} 字节超过限制 {max_size} 字节",
                "file_size": file_size,
                "max_size": max_size
            }
        )


class StorageQuotaExceededException(HTTPException):
    """存储配额超限异常"""
    def __init__(self, used_space: int, quota: int, required_space: int):
        super().__init__(
            status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
            detail={
                "code": "STORAGE_QUOTA_EXCEEDED",
                "message": f"存储空间不足。已使用: {used_space} 字节，配额: {quota} 字节，需要: {required_space} 字节",
                "used_space": used_space,
                "quota": quota,
                "required_space": required_space
            }
        )


class FileAlreadyExistsException(HTTPException):
    """文件已存在异常"""
    def __init__(self, filename: str):
        super().__init__(
            status_code=status.HTTP_409_CONFLICT,
            detail={
                "code": "FILE_ALREADY_EXISTS",
                "message": f"文件 '{filename}' 已存在",
                "filename": filename
            }
        )


class FileNotFoundException(HTTPException):
    """文件未找到异常"""
    def __init__(self):
        super().__init__(
            status_code=status.HTTP_404_NOT_FOUND,
            detail={
                "code": "FILE_NOT_FOUND",
                "message": "文件不存在"
            }
        )


class InvalidFileTypeException(HTTPException):
    """无效文件类型异常"""
    def __init__(self, file_extension: str):
        super().__init__(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail={
                "code": "INVALID_FILE_TYPE",
                "message": f"不支持的文件类型: {file_extension}",
                "file_extension": file_extension
            }
        )


class FileUploadException(HTTPException):
    """文件上传异常"""
    def __init__(self, message: str):
        super().__init__(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail={
                "code": "FILE_UPLOAD_FAILED",
                "message": f"文件上传失败: {message}"
            }
        )


class FileDeleteException(HTTPException):
    """文件删除异常"""
    def __init__(self, message: str):
        super().__init__(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail={
                "code": "FILE_DELETE_FAILED",
                "message": f"文件删除失败: {message}"
            }
        )