export interface Result<T = any> {
    /**
     * 状态码
     */
    status: Status

    /**
     * 消息
     */
    message: string

    /**
     * 响应时间
     */
    timestamp: string

    /**
     * 接口耗时（不含网络通信时间）
     */
    times: string

    /**
     * 自定义错误码
     */
    code: number

    /**
     * 详细信息
     */
    details?: string

    /**
     * 异常信息
     */
    error?: string

    /**
     * 响应内容
     */
    body: T
}

export enum Status {
    /**
     * 成功
     */
    OK = 200,

    /**
     * 用户认证失败
     */
    NON_AUTHORITATIVE_INFORMATION = 203,

    /**
     * 失败的请求，通常是一些验证错误（当出现该状态码时，将产生对应的业务错误编码，可以使用 Result.details 进行交互提醒）
     */
    FAIL = 400,

    /**
     * 鉴权失败
     */
    UNAUTHORIZED = 401,

    /**
     * Token 错误/失效
     */
    FORBIDDEN = 403,

    /**
     * 找不到资源
     */
    NOT_FOUND = 404,

    /**
     * 不支持的请求类型
     */
    METHOD_NOT_ALLOWED = 405,

    /**
     * 服务器错误
     */
    INTERNAL_SERVER_ERROR = 500,

    /**
     * API 未实现
     */
    NOT_IMPLEMENTED = 501,

    /**
     * 服务异常（网关提醒）
     */
    BAD_GATEWAY = 502,

    /**
     * 服务暂停（网关提醒）
     */
    SERVICE_UNAVAILABLE = 503,
}

export function toMessage(status: Status): string {
    switch (status) {
        case Status.OK:
            return '成功'
        case Status.FAIL:
            return '失败'
        case Status.UNAUTHORIZED:
            return '用户认证失败'
        case Status.FORBIDDEN:
            return '拒绝访问'
        case Status.NOT_FOUND:
            return '找不到资源'
        case Status.INTERNAL_SERVER_ERROR:
            return '服务器错误'
        case Status.NOT_IMPLEMENTED:
            return '未实现'
        case Status.BAD_GATEWAY:
            return '网关错误'
        case Status.SERVICE_UNAVAILABLE:
            return '服务暂停'
        default:
            return '未知错误'
    }
}
