import dayjs from 'dayjs'
import type { MockMethod } from 'vite-plugin-mock'

/**
 * 构建 URL 请求地址
 * @param path 请求地址
 * @returns 拼接 BASE_URL 后的请求地址
 */
export function URL(path: string): string {
    return `/basic-api${path}`
}

/**
 * 通用响应工具类
 */
export class Response {
    /**
     * 成功返回
     * @param data 数据
     * @param param 覆盖响应内容
     * @returns 通用响应结果
     */
    static ok<T = any>(data: T, { message = 'OK', code = 0 } = {}): defs.Result<T> {
        return {
            code,
            message,
            status: 200,
            times: '0.0s',
            timestamp: dayjs().format('yyyy-MM-dd HH:mm:ss'),
            body: data,
        }
    }

    /**
     * 失败返回
     * @param message 失败的消息
     * @param status 状态码
     * @param param 覆盖响应内容
     * @returns 通用响应结果
     */
    static no(message = 'fail', { status = 400, code = -1, details = '' } = {}): defs.Result<string> {
        return {
            code,
            status,
            message,
            details,
            times: '0.0s',
            timestamp: dayjs().format('yyyy-MM-dd HH:mm:ss'),
            body: null,
        }
    }

    /**
     * 包装正常返回的 GET 请求 MockMethod
     * @param url 请求地址
     * @param data 响应数据
     * @returns 经过包装的 MockMethod
     */
    static getOk<T = any>(url: string, data: T): MockMethod {
        return {
            url: URL(url),
            method: 'get',
            response: () => {
                return Response.ok(data)
            },
        }
    }
}

export class Request {
    method: string
    body: any
    headers?: { ['app-token']?: string }
    query: any

    /**
     * 获取 Token 值
     * @param param 请求参数
     * @returns token
     */
    static getRequestToken({ headers }: Request): string | undefined {
        return headers?.['app-token']
    }
}
