const $ = new Env('ApkTw')
$.VAL_login = $.getdata('chavy_cookie_apktw')

!(async () => {
    $.log('', `🔔 ${$.name}, 开始!`, '')
    await login()
    await getHash()
    await sign()
    await showmsg()
})()
    .catch((e) => {
        $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
    })
    .finally(() => {
        $.msg($.name, $.subt, ''), $.log('', `🔔 ${$.name}, 结束!`, ''), $.done()
    })

// 登录
function login() {
    const url = JSON.parse($.VAL_login)
    return new Promise((resove) => $.post(url, (error, response, data) => resove()))
}

function getHash() {
    return new Promise((resove) => {
        const url = {url: 'https://apk.tw/', headers: {}}
        url.headers['Host'] = 'apk.tw'
        url.headers['Referer'] = 'https://apk.tw/forum.php'
        url.headers['Accept'] = '*/*'
        url.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.4 Safari/605.1.15'
        $.get(url, (error, response, data) => {
            try {
                if (error) throw new Error(error)
                if (/\/source\/plugin\/dsu_amupper\/images\/wb\.gif/.test(data)) {
                    $.isSigned = true
                    $.isSignSuc = true
                } else {
                    $.isSigned = false
                    const [hash] = /plugin.php\?id=dsu_amupper:pper([^('|")]*)/.exec(data)
                    if (hash) {
                        $.hash = hash
                    } else {
                        $.isSignSuc = false
                    }
                }
            } catch (e) {
                $.log(`❗️ ${$.name}, 执行失败!`, ` error = ${error || e}`, `response = ${JSON.stringify(response)}`, '')
            } finally {
                resove()
            }
        })
    })
}

function sign() {
    if ($.isSigned && !$.hash) return
    return new Promise((resove) => {
        const url = {url: `https://apk.tw/${$.hash}&inajax=1&ajaxtarget=my_amupper`, headers: {}}
        $.log(`❕ ${url.url}!`)
        url.headers['Host'] = 'apk.tw'
        url.headers['Referer'] = 'https://apk.tw/forum.php'
        url.headers['Accept'] = '*/*'
        url.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.4 Safari/605.1.15'
        $.get(url, (error, response, data) => {
            try {
                if (error) throw new Error(error)
                if (/\/source\/plugin\/dsu_amupper\/images\/wb\.gif/.test(data)) {
                    $.isSignSuc = true
                } else {
                    $.isSignSuc = false
                }
            } catch (e) {
                $.isSignSuc = false
                $.log(`❗️ ${$.name}, 执行失败!`, ` error = ${error || e}`, `response = ${JSON.stringify(response)}`, '')
            } finally {
                resove()
            }
        })
    })
}

function showmsg() {
    return new Promise((resove) => {
        if ($.isSigned) {
            $.subt = '签到: 重复'
        } else if (!$.isSigned && $.isSignSuc) {
            $.subt = '签到: 成功'
        } else {
            $.subt = '签到: 失败'
        }
        resove()
    })
}

// prettier-ignore
function Env(t) {
    this.name = t, this.logs = [], this.isSurge = (() => "undefined" != typeof $httpClient), this.isQuanX = (() => "undefined" != typeof $task), this.log = ((...t) => {
        this.logs = [...this.logs, ...t], t ? console.log(t.join("\n")) : console.log(this.logs.join("\n"))
    }), this.msg = ((t = this.name, s = "", i = "") => {
        this.isSurge() && $notification.post(t, s, i), this.isQuanX() && $notify(t, s, i);
        const e = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];
        t && e.push(t), s && e.push(s), i && e.push(i), console.log(e.join("\n"))
    }), this.getdata = (t => this.isSurge() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : void 0), this.setdata = ((t, s) => this.isSurge() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : void 0), this.get = ((t, s) => this.send(t, "GET", s)), this.wait = ((t, s = t) => i => setTimeout(() => i(), Math.floor(Math.random() * (s - t + 1) + t))), this.post = ((t, s) => this.send(t, "POST", s)), this.send = ((t, s, i) => {
        if (this.isSurge()) {
            const e = "POST" == s ? $httpClient.post : $httpClient.get;
            e(t, (t, s, e) => {
                s && (s.body = e, s.statusCode = s.status), i(t, s, e)
            })
        }
        this.isQuanX() && (t.method = s, $task.fetch(t).then(t => {
            t.status = t.statusCode, i(null, t, t.body)
        }, t => i(t.error, t, t)))
    }), this.done = ((t = {}) => $done(t))
}
