const os = require("os");
const path = require("path");

// 格式化字节数为人类可读的单位
function formatBytes(bytes) {
  const size = {
    GB: 1024 * 1024 * 1024,
    MB: 1024 * 1024,
    KB: 1024,
    B: 1,
  };
  for (const key in size) {
    if (bytes >= size[key]) return `${bytes / size[key]} ${key}`;
  }
}

// 工具函数：统一处理路径分隔符为正斜杠
const formatPath = (pathStr) => {
  return pathStr.replace(/\\/g, "/"); // 单个反斜杠替换为正斜杠
};

// 1. 操作系统基本信息
const getSystemInfo = () => {
  return {
    osType: os.type(),
    osPlatform: os.platform(),
    osVersion: os.release(),
    osName: os.version(),
    arch: os.arch(),
    hostname: os.hostname(),
    systemStartTime: new Date(os.uptime() * 1000).toLocaleDateString(),
    systemRunningTime: `${Math.floor(os.uptime() / 3600)}小时 ${
      Math.floor(os.uptime() % 3600) / 60
    }分钟`,
  };
};

// 2. CPU信息
const getCPUInfo = () => {
  const cpus = os.cpus();
  return {
    number: cpus.length,
    model: cpus[0].model,
    speed: cpus[0].speed + "MHz",
  };
};

// 3. 内存信息
const getMemoryInfo = () => {
  return {
    total: formatBytes(os.totalmem()),
    freeMemory: formatBytes(os.freemem()),
    useMemory: formatBytes(os.totalmem() - os.freemem()),
    useRate: `${Math.round((1 - os.freemem() / os.totalmem()) * 100)}%`,
  };
};

// 4. 用户信息
const getUserInfo = () => {
  const userInfo = os.userInfo();
  return {
    userName: userInfo.username,
    uid: userInfo.uid,
    gid: userInfo.gid,
    homeDir: formatPath(userInfo.homedir),
    shell: userInfo.shell || "unknown",
  };
};

// 5. 目录信息
const getDirInfo = () => {
  return {
    homeDir: formatPath(os.homedir()),
    tmpDir: formatPath(os.tmpdir()),
  };
};

// 6. 负载信息 (仅 Unix 系统有效)
const getDutyInfo = () => {
  const loadavg = os.loadavg();
  return {
    min1: loadavg[0].toFixed(2),
    min5: loadavg[1].toFixed(2),
    min15: loadavg[2].toFixed(2),
  };
};

// 7. 网络接口信息
const getNetworkInterfaceInfo = () => {
  const networkInterfaces = os.networkInterfaces();
  const data = [];
  for (const [interfaceName, interfaceInfo] of Object.entries(
    networkInterfaces
  )) {
    let item;
    interfaceInfo.forEach((info) => {
      item = {
        name: interfaceName,
        family: info.family,
        ip: info.address,
        mac: info.mac,
        localAddress: info.internal ? true : false,
        netmask: info.netmask,
        gateway: info.gateway,
      };
    });
    data.push(item);
  }
  return data;
};

const getAll = () => {
  return {
    SystemInfo: getSystemInfo(),
    CPUInfo: getCPUInfo(),
    MemoryInfo: getMemoryInfo(),
    UserInfo: getUserInfo(),
    DirInfo: getDirInfo(),
    DutyInfo: getDutyInfo(),
    NetworkInterfaceInfo: getNetworkInterfaceInfo(),
  };
};

module.exports = {
  getSystemInfo,
  getCPUInfo,
  getMemoryInfo,
  getUserInfo,
  getDirInfo,
  getDutyInfo,
  getNetworkInterfaceInfo,
  getAll,
};
