import si from "systeminformation";
import Xev from "xev";
import * as osUtils from "os-utils";
import { fetchMeta } from "../misc/fetch-meta.js";
const ev = new Xev();
const interval = 2000;
const roundCpu = (num)=>Math.round(num * 1000) / 1000;
const round = (num)=>Math.round(num * 10) / 10;
/**
 * Report server stats regularly
 */ export default function() {
    const log = [];
    ev.on("requestServerStatsLog", (x)=>{
        ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50));
    });
    fetchMeta().then((meta)=>{
        if (!meta.enableServerMachineStats) return;
    });
    async function tick() {
        const cpu = await cpuUsage();
        const memStats = await mem();
        const netStats = await net();
        const fsStats = await fs();
        const stats = {
            cpu: roundCpu(cpu),
            mem: {
                used: round(memStats.used - memStats.buffers - memStats.cached),
                active: round(memStats.active),
                total: round(memStats.total)
            },
            net: {
                rx: round(Math.max(0, netStats.rx_sec)),
                tx: round(Math.max(0, netStats.tx_sec))
            },
            fs: {
                r: round(Math.max(0, fsStats.rIO_sec ?? 0)),
                w: round(Math.max(0, fsStats.wIO_sec ?? 0))
            }
        };
        ev.emit("serverStats", stats);
        log.unshift(stats);
        if (log.length > 200) log.pop();
    }
    tick();
    setInterval(tick, interval);
}
// CPU STAT
function cpuUsage() {
    return new Promise((res, rej)=>{
        osUtils.cpuUsage((cpuUsage)=>{
            res(cpuUsage);
        });
    });
}
// MEMORY STAT
async function mem() {
    const data = await si.mem();
    return data;
}
// NETWORK STAT
async function net() {
    const iface = await si.networkInterfaceDefault();
    const data = await si.networkStats(iface);
    return data[0];
}
// FS STAT
async function fs() {
    const data = await si.disksIO().catch(()=>({
            rIO_sec: 0,
            wIO_sec: 0
        }));
    return data || {
        rIO_sec: 0,
        wIO_sec: 0
    };
}
