import * as os from "node:os";
import si from "systeminformation";
import define from "../../define.js";
import { redisClient } from "../../../../db/redis.js";
import { db } from "../../../../db/postgre.js";
export const meta = {
    requireCredential: true,
    requireModerator: true,
    tags: [
        "admin",
        "meta"
    ],
    res: {
        type: "object",
        optional: false,
        nullable: false,
        properties: {
            machine: {
                type: "string",
                optional: false,
                nullable: false
            },
            os: {
                type: "string",
                optional: false,
                nullable: false,
                example: "linux"
            },
            node: {
                type: "string",
                optional: false,
                nullable: false
            },
            psql: {
                type: "string",
                optional: false,
                nullable: false
            },
            cpu: {
                type: "object",
                optional: false,
                nullable: false,
                properties: {
                    model: {
                        type: "string",
                        optional: false,
                        nullable: false
                    },
                    cores: {
                        type: "number",
                        optional: false,
                        nullable: false
                    }
                }
            },
            mem: {
                type: "object",
                optional: false,
                nullable: false,
                properties: {
                    total: {
                        type: "number",
                        optional: false,
                        nullable: false,
                        format: "bytes"
                    }
                }
            },
            fs: {
                type: "object",
                optional: false,
                nullable: false,
                properties: {
                    total: {
                        type: "number",
                        optional: false,
                        nullable: false,
                        format: "bytes"
                    },
                    used: {
                        type: "number",
                        optional: false,
                        nullable: false,
                        format: "bytes"
                    }
                }
            },
            net: {
                type: "object",
                optional: false,
                nullable: false,
                properties: {
                    interface: {
                        type: "string",
                        optional: false,
                        nullable: false,
                        example: "eth0"
                    }
                }
            }
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {},
    required: []
};
export default define(meta, paramDef, async ()=>{
    const memStats = await si.mem();
    const fsStats = await si.fsSize();
    const netInterface = await si.networkInterfaceDefault();
    const redisServerInfo = await redisClient.info("Server");
    const m = redisServerInfo.match(new RegExp("^redis_version:(.*)", "m"));
    const redis_version = m?.[1];
    return {
        machine: os.hostname(),
        os: os.platform(),
        node: process.version,
        psql: await db.query("SHOW server_version").then((x)=>x[0].server_version),
        redis: redis_version,
        cpu: {
            model: os.cpus()[0].model,
            cores: os.cpus().length
        },
        mem: {
            total: memStats.total
        },
        fs: {
            total: fsStats[0].size,
            used: fsStats[0].used
        },
        net: {
            interface: netInterface
        }
    };
});
