/**
 *@description: 请求接口配置文件
 *@return {*}
 *@param 
*/
import urlConfig from "./config";
import toast from "@/utils/toast";
import { getStorage } from "@/utils/storage";
import { store } from "@/store";
import { addTask, jx_trembling } from "@/utils/tools";
// import configCms from "@/utils/configCms";
import log from '@/utils/log'
import configCms from "@/utils/configCms";


// 定义请求类型
type methodsType = "GET" | "OPTIONS" | "HEAD" | "POST" | "PUT" | "DELETE" | "TRACE" | "CONNECT" | undefined
// 定义方法中的类型
type FnApiType = {
    (url: string, methods: methodsType, data?: AnyObject | string, timeout?: number, baseURL?: string, contentType?: string): Promise<AnyObject>
}
// 定义方法类型
interface Api {
    api: FnApiType
}
// 请求类型请求头
let cType = 'application/x-www-form-urlencoded'
// 最大超时时间默认15秒
let timeouts: any = 0
// 清空定时器，在800毫秒内数据请求回来了就清空定时器
let timer: any
// 最大请求加载图层时间
let timer1: any
// 保存请求中断
let requestTask: any = null


/*************************************************
 * 封装请求方法
 * @param {string} [url] 请求地址
 * @param {methodsType} [method] 请求方法默认GET
 * @param {object} [data] 请求参数默认""
 * @param {number} [timeout] 请求超时时间
 * @param {string} [baseURL] 请求根路径默认https://wx.jxc4.com
 * @param {string} [contentType] 请求头类型默认'application/x-www-form-urlencoded'
 * @return {promist} [resolve, reject] promist成功与失败
*/

const request: Api = {
    // timeout = 1000 * 20000
    api: (url, method = 'GET', data = "", timeout = 1000 * 20, baseURL = urlConfig, contentType = cType) => {
        if (requestGuard(url)) {
            return new Promise((resolve, reject) => { })
        }
        timeouts = timeout
        // store.commit('storeInfo/jxLoadingFn', false)    // 关闭自定义加载图（vuex)
        clearTimeout(timer)
        timer = setTimeout(() => {
            // 显示自定义加载图(vuex)
            // store.commit('storeInfo/jxLoadingFn', true)
            // uni.showNavigationBarLoading()
            // 最大时间加载图
            tremblingJxLoadingFn()
        }, 600)
        // if (url == '/v2/cms/GetNewOrderMsg') store.commit('storeInfo/jxLoadingFn', false)
        return new Promise((resolve, reject) => {
            requestTask = uni.request({
                url: baseURL + url,
                method: method,
                data: data,
                timeout: timeout,
                header: {
                    'content-type': contentType,
                    //  && store.getters['serveInfo/isLogin']
                    'Authorization': !configCms.whiteListUrl.includes(url) ? getStorage('token') ? getStorage('token') : '' : ''
                },
                success: (res) => {
                    //#region
                    let logData = {
                        '日志记录时间': Date(),
                        '调用接口': url,
                        '请求方法': method,
                        '请求参数': data,
                        '请求超时时间': timeout,
                        '请求域名': baseURL,
                        '登录类型': getStorage('loginType') ? getStorage('loginType') : '未获取到用户登录类型',
                        '用户TOKEN': getStorage('token') ? getStorage('token') : '未获取到用户TOKEN',
                        // '权限ID': getStorage('userType') ? getStorage('userType') : '未获取到用户权限ID',
                        // '用户ID': getStorage('userID') ? getStorage('userID') : '未获取到用户ID',
                        // '用户ID2': getStorage('userID2') ? getStorage('userID2') : '未获取到用户ID2',
                        '用户手机号': getStorage('mobile') ? getStorage('mobile') : '未获取到用户手机号',
                        // '店铺ID': getStorage('storeID') ? getStorage('storeID') : '未获取到店铺ID',
                        // '店铺名字': getStorage('storeName') ? getStorage('storeName') : '未获取到店铺名字',
                        '网络状态码': res.statusCode,
                        '服务端数据': res.data
                    }
                    //#endregion
                    // store.commit('storeInfo/jxLoadingFn', false)    // 关闭自定义加载图（vuex)
                    if (res.statusCode >= 200 && res.statusCode < 300) {
                        log.info(JSON.stringify(logData))
                        // 通过token 验证 通过store 验证
                        if ((res.data as AnyObject).code == '-2') {
                            // uni.jxAlert({
                            //     title: '提示',
                            //     content: '登录信息已过期',
                            //     confirmText: '重新登录',
                            //     success: () => {
                            //         cleatStorage()
                            //         uni.reLaunch({ url: '/subPages/login/wxLogin/wxLogin' })
                            //     }
                            // })
                            return false
                        } else {
                            // 验证通过
                            try {
                                const jsonData = JSON.parse((res.data as AnyObject).data)
                                resolve({
                                    code: (res.data as AnyObject).code,
                                    data: jsonData,
                                    desc: (res.data as AnyObject).msg
                                })
                            } catch (error) {
                                resolve(res.data as AnyObject)
                            }
                        }
                    } else if (res.statusCode >= 400 && res.statusCode < 500) {
                        log.warn(JSON.stringify(logData))
                        toast('客户端出错', 2)
                        reject('客户端出错')
                    } else if (res.statusCode >= 500) {
                        log.warn(JSON.stringify(logData))
                        toast('服务端出错', 2)
                        reject('服务端出错')
                    } else {
                        log.warn(JSON.stringify(logData))
                        toast('网络请求出错', 2)
                    }
                },
                fail: (error) => {
                    if (error.errMsg == 'request:fail abort') {
                        // 中断请求
                        return false
                    }
                    toast('网络请求超时', 2)
                    console.log('jx-网络请求超时', error);
                    reject(`网络请求超时 -- request.ts, ${error}`)
                    //#region
                    let logData = {
                        '日志记录时间': Date(),
                        '调用接口': url,
                        '请求方法': method,
                        '请求参数': data,
                        '请求超时时间': timeout,
                        '请求域名': baseURL,
                        '登录类型': getStorage('loginType') ? getStorage('loginType') : '未获取到用户登录类型',
                        '用户TOKEN': getStorage('token') ? getStorage('token') : '未获取到用户TOKEN',
                        // '权限ID': getStorage('userType') ? getStorage('userType') : '未获取到用户权限ID',
                        // '用户ID': getStorage('userID') ? getStorage('userID') : '未获取到用户ID',
                        // '用户ID2': getStorage('userID2') ? getStorage('userID2') : '未获取到用户ID2',
                        '用户手机号': getStorage('mobile') ? getStorage('mobile') : '未获取到用户手机号',
                        // '店铺ID': getStorage('storeID') ? getStorage('storeID') : '未获取到店铺ID',
                        // '店铺名字': getStorage('storeName') ? getStorage('storeName') : '未获取到店铺名字',
                        '请求错误信息': error
                    }
                    log.error(JSON.stringify(logData))   // 普通请求日志
                    //#endregion
                },
                complete: () => {
                    uni.stopPullDownRefresh()
                    // uni.hideNavigationBarLoading()
                    // store.commit('storeInfo/jxLoadingFn', false)    // 关闭自定义加载图（vuex)
                    uni.hideLoading()
                    clearTimeout(timer)     // 清空定时器
                }
            })

            // 添加请求记录到缓存
            if (url == '/v2/cms/GetNewOrderMsg') return
            addTask(requestTask)
        })
    }
}

/*************************************************
 * 防抖超时加载图层
*/
const tremblingJxLoadingFn = jx_trembling(() => {
    clearTimeout(timer1)
    timer1 = setTimeout(() => {
        // store.commit('storeInfo/jxLoadingFn', false)    // 关闭自定义加载图（vuex)
        clearTimeout(timer1)
    }, timeouts)
}, 500)


/*************************************************
 * 登录守卫
*/
function requestGuard(url: string) {
    // 获取网络状态
    uni.getNetworkType({
        success: (res) => {
            if (res.networkType == 'none') {
                store.commit('serveInfo/setIsNetWorkS', false)
            } else {
                store.commit('serveInfo/setIsNetWorkS', true)
            }
        }
    })

    // // 验证token
    // if (!getStorage('token') && !configCms.whiteListUrl.includes(url)) {
    //     // store.commit('serveInfo/setIsFirestLogin', true)
    //     return true
    // }

    // // 验证storeID
    // if (!getStorage('storeID') && !configCms.whiteListUrl.includes(url)) {
    //     rulerStoreID()
    //     return true
    // }

    // // 验证网络状态
    // if (!store.state.serveInfo.isNetWork) {
    //     return true
    // }

    // store.commit('serveInfo/setIsFirestLogin', getStorage('token') ? false : true)
    return false
}
// // 门店防抖节流
// const rulerStoreID = jx_trembling(() => {
//     uni.navigateTo({ url: "/subPages/switchStore/switchStore" })
// }, 1000)


export default request