const formatBytes = (bytes, decimals) => {
  if (bytes === 0) {
    return '0 Bytes';
  }

  const k = 1000;
  const dm = (decimals + 1) || 3;
  const sizes = [
    'Bytes',
    'KB',
    'MB',
    'GB',
    'TB',
    'PB',
    'EB',
    'ZB',
    'YB'
  ];
  const i = Math.floor(Math.log(bytes) / Math.log(k));

  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
}

module.exports = (shepherd) => {
  shepherd.SystemInfo = () => {
    const os_data = {
      'totalmem_bytes': shepherd.os.totalmem(),
      'totalmem_readable': formatBytes(shepherd.os.totalmem()),
      'arch': shepherd.os.arch(),
      'cpu': shepherd.os.cpus()[0].model,
      'cpu_cores': shepherd.os.cpus().length,
      'platform': shepherd.os.platform(),
      'os_release': shepherd.os.release(),
      'os_type': shepherd.os.type(),
    };

    return os_data;
  }

  shepherd.appInfo = () => {
    const sysInfo = shepherd.SystemInfo();
    const releaseInfo = shepherd.appBasicInfo;
    const dirs = {
      agamaDir: shepherd.agamaDir,
      komodoDir: shepherd.komodoDir,
      komododBin: shepherd.komododBin,
      configLocation: `${shepherd.agamaDir}/config.json`,
      cacheLocation: `${shepherd.agamaDir}/shepherd`,
    };

    return {
      sysInfo,
      releaseInfo,
      dirs,
    };
  }

  /*
   *  type: GET
   *
   */
  shepherd.get('/sysinfo', (req, res, next) => {
    if (shepherd.checkToken(req.query.token)) {
      const obj = shepherd.SystemInfo();
      res.send(obj);
    } else {
      const errorObj = {
        msg: 'error',
        result: 'unauthorized access',
      };

      res.end(JSON.stringify(errorObj));
    }
  });

  /*
   *  type: GET
   *
   */
  shepherd.get('/appinfo', (req, res, next) => {
    if (shepherd.checkToken(req.query.token)) {
      const obj = shepherd.appInfo();
      res.send(obj);
    } else {
      const errorObj = {
        msg: 'error',
        result: 'unauthorized access',
      };

      res.end(JSON.stringify(errorObj));
    }
  });

  return shepherd;
};