const { exec } = require('child_process');

export const diskSpaceLinux = (path) => {
  return new Promise((resolve, reject) => {
    exec(`df ${path}`, (error, stdout, stderr) => {
      if (error) {
        return reject(error);
      }
      if (stderr) {
        return reject(new Error(stderr));
      }
      // Sample df command output:
      // Filesystem     1K-blocks      Used Available Use% Mounted on
      // C:\            185087700 120552556  64535144  66% /mnt/c
      const dfResult = stdout.split('\n')[1].split(/\s+/);
      resolve({
        total: Number(dfResult[1]),
        free: Number(dfResult[3]),
      });
    });
  });
};

export const diskSpaceMac = (path) => {
  // Escape spaces in path to prevent errors.
  // Example:
  // "/Users/username/Library/Application Support/LBRY" gets updated to
  // "/Users/username/Library/Application\\ Support/LBRY"
  const escapedPath = path.replace(/(\s+)/g, '\\$1');
  return diskSpaceLinux(escapedPath);
};

export const diskSpaceWindows = (path) => {
  return new Promise((resolve, reject) => {
    exec(`wmic logicaldisk get size,freespace,caption`, (error, stdout, stderr) => {
      if (error) {
        return reject(error);
      }
      if (stderr) {
        return reject(new Error(stderr));
      }

      // Drive used in the path (ie, C:, D:, etc.)
      const pathDrive = path.split(':')[0] + ':';

      // Sample outout:
      // Caption  FreeSpace    Size
      // C:       66218471424  189529804800
      // D:
      // E:       536829952    536854528
      const stdoutLines = stdout.split('\n');
      // Find the drive used in the path.
      const driveLine = stdoutLines.find((line) => line.startsWith(pathDrive));
      // Parse the values in each column by filtering out the
      // empty spaces.
      // eslint-disable-next-line no-unused-vars
      const [drive, freeSpace, totalSize] = driveLine.split(' ').filter((x) => x);

      resolve({
        total: Math.floor(Number(totalSize) / 1024),
        free: Math.floor(Number(freeSpace) / 1024),
      });
    });
  });
};