import {resolve} from "path";
import {PublicShared} from "../../shared/public/public";
import {Scheduler, schedulerType} from "./scheduler";
import {existsSync, readFileSync} from "fs";
import {addWatchDogLog, errorLogDB} from "../../gameLog";

export class WatchDog extends Scheduler {
    id: schedulerType = "watch_dog";
    time = 420;  // 监控频率，每x秒一次
    name = "数据看门狗"
    type = ""

    async read() {
        await this.ctorStartTime();
        this.isReady = false;
        this.startTime = this.nextTime;
    }

    async start() {
        let confFile = resolve(__dirname, '../../oss/watchdog.json');
        if (!existsSync(confFile)) {
            //配置文件不存在
            await this.ctorStartTime()
            return;
        }
        let conf;
        try {
            conf = await JSON.parse(readFileSync(confFile, 'utf-8'));
        } catch (e) {
            //配置文件不是json
            await this.ctorStartTime()
            return;
        }
        //获取今天0点之后在线的玩家
        let users = await G.mongodb.collection("user").find({
            lv: {$gt: 10},
            newonlinetime: {$gte: G.time - 3600, $lte: G.time + 30}
        }, {
            projection: {
                uid: 1,
                name: 1,
                lv: 1,
                vip: 1,
                sid: 1
            }
        }).toArray();

        if (!users.length) {
            //没有符合的玩家
            await this.ctorStartTime()
            return;
        }

        let uids = users.map(i => i.uid);
        let uinfo = {};
        users.map(i => uinfo[i.uid] = i);

        let actionLogs = await G.mongodb.collection("actionLog").find({
            type: 'day',
            uid: {$in: uids},
        }, {
            projection: {
                uid: 1,
                log: 1
            }
        }).toArray();

        let warns = [];
        for (let j = 0; j < conf.length; j++) {
            for (let i = 0; i < actionLogs.length; i++) {
                let key = conf[j].key;
                let myval = actionLogs[i]?.log?.[key] || 0
                let uid = actionLogs[i].uid
                if (myval > conf[j].limit) {
                    //触发了警报
                    warns.push({
                        type: 'watchDog',
                        uid: uid,
                        name: uinfo[uid]?.name,
                        lv: uinfo[uid]?.lv,
                        vip: uinfo[uid]?.vip,
                        key: key,
                        value: myval,
                        tips: conf[j].tips
                    })
                }
            }
        }

        if (warns.length > 0) {
            addWatchDogLog(warns);
        }

        await this.ctorStartTime()
    }

    get nextTime(): number {
        return G.time + this.time;
    }

    async ctorStartTime() {
        this.isStart = false;
        this.startTime = this.nextTime;
    }
}