const projectBaseURL = "https://project.gter.net"

if (["localhost", "127.0.0.1"].includes(location.hostname)) {
    axios.defaults.headers = {
        "Authorization": "97d1c7b2fe6dec05aaf52c0f3b9130e8",
    }
}

function $ajax(url) {
    var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}
    url = url.indexOf("https://") > -1 ? url : projectBaseURL + url

    if (["localhost", "127.0.0.1"].includes(location.hostname)) data["authorization"] = "97d1c7b2fe6dec05aaf52c0f3b9130e8"

    return new Promise(function (resolve, reject) {
        axios
            .post(url, data, {
                emulateJSON: true,
                withCredentials: true,
            })
            .then(function (res) {
                var data = typeof res.data == "string" ? JSON.parse(res.data) : res.data
                if (data.code == 401) {
                    showWindow("login", "https://passport.gter.net/login/ajax", "get", -1, { cover: true })
                    reject()
                }
                if (data.code == 201) creationAlertBox("error", data.message || data.msg)
                resolve(data)
            })
            .catch(err => {
                if (err.response?.status == 401) showWindow("login", "https://passport.gter.net/login/ajax", "get", -1, { cover: true })
            })
    })
}

function $ajaxget(url, data) {
    if (!data) data = {}

    // data["authorization"] = "97d1c7b2fe6dec05aaf52c0f3b9130e8"
    if (["localhost", "127.0.0.1"].includes(location.hostname)) data["authorization"] = "97d1c7b2fe6dec05aaf52c0f3b9130e8"

    url = url.indexOf("https://") > -1 ? url : projectBaseURL + url
    url += objectToQueryString(data)
    return new Promise(function (resolve, reject) {
        axios
            .get(
                url,
                {},
                {
                    emulateJSON: true,
                    withCredentials: true,
                }
            )
            .then(function (res) {
                var data = typeof res.data == "string" ? JSON.parse(res.data) : res.data
                if (data.code == 401) {
                    showWindow("login", "https://passport.gter.net/login/ajax", "get", -1, { cover: true })
                    reject()
                }
                if (data.code == 201) creationAlertBox("error", data.message || data.msg)

                resolve(data)
            })
            .catch(error => {
                if (error.response?.status == 401) showWindow("login", "https://passport.gter.net/login/ajax", "get", -1, { cover: true })
                reject(error)
            })
    })
}

function randomString(n) {
    let str = "abcdefghijklmnopqrstuvwxyz9876543210"
    let tmp = "",
        i = 0,
        l = str.length
    for (i = 0; i < n; i++) {
        tmp += str.charAt(Math.floor(Math.random() * l))
    }
    return tmp
}

function formatNumberWithSpaces(number) {
    if (typeof number != "string") number = ""
    return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
}

// 将一个JavaScript对象转换为路由参数的形式将键值对转换为key=value的形式
function objectToQueryString(obj = {}) {
    const queryString = Object.keys(obj)
        .map(key => encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]))
        .join("&")
    return queryString ? "?" + queryString : ""
}

function decodeKey(encrypted, key) {
    return new Promise((resolve, reject) => {
        try {
            const storedData = localStorage.getItem("basicData")
            const basicData = JSON.parse(storedData)
            if (!key) key = basicData.encodekey

            const encryptedData = CryptoJS.enc.Base64.parse(encrypted)

            const decrypted = CryptoJS.AES.decrypt(
                {
                    ciphertext: encryptedData,
                },
                CryptoJS.enc.Utf8.parse(key),
                {
                    mode: CryptoJS.mode.ECB,
                    padding: CryptoJS.pad.Pkcs7,
                }
            )

            const text = JSON.parse(decrypted.toString(CryptoJS.enc.Utf8))
            resolve(text)
        } catch (error) {
            reject()
        }
    })
}

function getBaseData() {
    return new Promise((resolve, reject) => {
        const storedTime = localStorage.getItem("dataTimestamp")
        const storedData = localStorage.getItem("basicData")

        const currentTime = new Date().getTime()
        const timeDiff = currentTime - parseInt(storedTime)
        if (storedTime && storedData && timeDiff <= 5 * 60 * 1000) {
            // 在5分钟内,使用本地存储的数据
            const basicData = JSON.parse(storedData)
            // 处理数据
            resolve(basicData)
        }

        $ajaxget("/api/home/basicData").then(res => {
            if (res.code != 200) return
            const data = res.data
            const user = data.user
            const basicData = {
                contrastcount: data.contrastcount || 0,
                university: data.university,
                discipline: data.discipline,
                rankings: data.rankings,
                encodekey: data.encodekey,
                user,
            }
            if (user.uin > 0) {
                // 更新本地存储的时间戳和数据
                localStorage.setItem("dataTimestamp", new Date().getTime())
                localStorage.setItem("basicData", JSON.stringify(basicData))
            }
            resolve(basicData)
        })
    })
}