import { getDoctorWxEnv } from '@/config/app-env.js';

/** 与 newApi 医生端接口一致；环境见 config/app-env.js */
export const DOCTOR_NEWAPI_BASE = getDoctorWxEnv().newApiBase;

/** 用于拉取同站点 public/traditional.json（与 DOCTOR_NEWAPI_BASE 同源） */
export function getDoctorNewApiStaticOrigin() {
	try {
		return new URL(DOCTOR_NEWAPI_BASE).origin;
	} catch (e) {
		return '';
	}
}

export async function requestConfig(ins, options, successHandler = null, failHandler = null, completeHandler = null){
    //原来是：ins.baseUrl = options.baseUrl || ins.baseUrl
    let baseUrl = options.baseUrl || ins.baseUrl;
    // TODO 这里写dev还是生产环境
    if (options.url.split('/').indexOf('newApi') !== -1) {
        baseUrl = DOCTOR_NEWAPI_BASE;
    }
    options.url = options.url.replace('/oldApi/', '');
    options.url = options.url.replace('/newApi/', '');
    const defaultHeader = { 'Content-Type': 'application/x-www-form-urlencoded' }
    // 每次请求独立合并 header，避免登录 isToken:false 污染单例
    let config = {
        url:`${baseUrl}${options.url?options.url:''}`,
        header: { ...defaultHeader, ...(options.header || {}) }
    }
    if(ins.requestInterceptor){
        let _cg = null
        // 合并请求拦截器配置
        try {
            _cg = await ins.requestInterceptor(Object.assign({}, options, config))
        } catch (e){
            return false
        }
        // config为false或null return
        if(!_cg || typeof _cg !== 'object'){
            return false
        }
        // 更新options
        Object.assign(options, _cg)
        config.url = options.url
        config.header = options.header
    }
    const type = options.type || "request"
    //  config 详情 如果options没有直接使用，删除props
    if(type === "request"){
        config["data"] = options.data || options.params || {}
        config["method"] = options.method || "GET"
        config["dataType"] = options.dataType || "json"
        config["responseType"] = options.responseType || "text"
		config['sslVerify'] = false

        // 如果是需要提交复杂对象/数组的写操作（POST/PUT/PATCH），强制使用 JSON 提交
        const method = (config["method"] || "GET").toUpperCase()
        if (["POST", "PUT", "PATCH"].includes(method)) {
            const data = config["data"]
            if (data && typeof data === 'object') {
                const hasComplexValue = Object.values(data).some((v) => {
                    return v && typeof v === 'object'
                })
                if (hasComplexValue) {
                    config.header["Content-Type"] = "application/json"
                }
            }
        }
    }else if(type === "upload"){
        config["filePath"] = options.filePath
        config["name"] = options.name
        config["method"] = options.method || "POST"
        config["formData"] = options.formData
        // fileType for alipay
        config["fileType"] = options.fileType || "image"
		config['sslVerify'] = false
        // 强制删除 Content-Type
        delete config.header["Content-Type"]
    }
    return config
 }

 function _isPromise(obj) {
     return obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'
 }
