/**
 * FIXED: 固定说明，此文件内不允许使用 import.env 之类的环境变量，否则会导致使用 Webview/RenderJS 相关模块异常
 */

const PROXY_LIST: [[string, string]?] = [
    // eg: 开发环境
    // ['http://192.168.1.100:18100', `http://proxy.yiring.com:41180`],
    // eg: 测试环境
    // ['http://10.111.117.15:18100', `http://proxy.yiring.com:42180`],
    // eg: 生产环境
    // [`http://192.168.0.100:18100`, `https://oss.beta.app.yiring.com`],
]

/**
 * 将内部地址（内网）转换成代理/预览地址（公网）
 * @param url 内网地址
 */
export function getExtranetUrl(url: string): string {
    let uri = url

    PROXY_LIST.forEach((proxy) => {
        uri = uri.replace(new RegExp(proxy[0], 'gi'), proxy[1])
    })

    return uri
}

/**
 * 将代理/预览地址（公网）转换成内部地址（内网）
 * eg: 主要用于解决内网文件上传后预览，但是实际上传存储时还是内网地址的问题
 * @param url 包含代理/公网地址的内容
 */
export function getIntranetUrl(url: string): string {
    let uri = url

    PROXY_LIST.forEach((proxy) => {
        uri = uri.replace(new RegExp(proxy[1], 'gi'), proxy[0])
    })

    return uri
}

/**
 * 替换处理返回的数据中本地链接
 * @param body 接口返回的内容
 * @returns 替换本地链接后的数据结果
 */
export function handleResponseResource<T>(body: T, options: Recordable) {
    for (const [intranet, extranet] of PROXY_LIST) {
        // 当需要处理内外网资源地址映射时，进行内容处理
        const isIntranet = options.apiUrl.includes(intranet)
        const isExtranet = options.apiUrl.includes(extranet)
        if (isIntranet || isExtranet) {
            const isString = typeof body === 'string'
            const isObject = typeof body === 'object'

            // 处理有效数据
            if (isString || isObject) {
                let text = isString ? body : JSON.stringify(body)
                // 说明: 如果接口地址是内网，就需要将外网链接转换成内网链接，如果是外网接口地址，则需要将内网地址转换成外网链接，来保证无论内外网访问平台资源都是正常的
                text = isExtranet ? getExtranetUrl(text) : getIntranetUrl(text)
                return (isString ? text : JSON.parse(text)) as T
            }
        }
    }

    return body
}
