package com.narutohuo.xindazhou.common.networkrx

/**
 * 响应异常
 * 
 * 封装 API 响应中的错误信息
 * 
 * 对应 MVVMHabit 的 ResponseThrowable
 */
open class ResponseThrowable(
    val code: Int,
    message: String,
    val error: Throwable? = null
) : Exception(message, error) {
    
    /**
     * 错误类型
     */
    val errorType: ErrorType
        get() = when (code) {
            in 400..499 -> ErrorType.CLIENT_ERROR
            in 500..599 -> ErrorType.SERVER_ERROR
            401 -> ErrorType.UNAUTHORIZED
            403 -> ErrorType.FORBIDDEN
            404 -> ErrorType.NOT_FOUND
            else -> ErrorType.OTHER
        }
    
    /**
     * 错误类型枚举
     */
    enum class ErrorType {
        /** 客户端错误 */
        CLIENT_ERROR,
        /** 服务器错误 */
        SERVER_ERROR,
        /** 未授权 */
        UNAUTHORIZED,
        /** 禁止访问 */
        FORBIDDEN,
        /** 资源不存在 */
        NOT_FOUND,
        /** 其他错误 */
        OTHER
    }
    
    override fun toString(): String {
        return "ResponseThrowable(code=$code, message='$message', errorType=$errorType)"
    }
}

/**
 * 业务错误
 * 
 * 用于封装业务逻辑错误
 */
class BusinessException(
    code: Int,
    message: String,
    error: Throwable? = null
) : ResponseThrowable(code, message, error)

/**
 * 网络错误
 * 
 * 用于封装网络相关错误
 */
class NetworkException(
    message: String,
    error: Throwable? = null
) : ResponseThrowable(-1, message, error)

/**
 * Token 过期错误
 * 
 * 用于封装 Token 过期错误
 */
class TokenExpiredException(
    message: String = "Token 已过期",
    error: Throwable? = null
) : ResponseThrowable(401, message, error)
