import {VitaSpawn} from "../interfaces/vita-spawn";
import {ChildProcess, spawn} from 'child_process';
import {ForceErrorImpl} from "firmament-yargs";
export class VitaSpawnImpl extends ForceErrorImpl implements VitaSpawn {
  spawnIt(cmd,
          args,
          cbStatus: (err: Error, dataChunk: Uint8Array)=>void,
          cbFinal: (err: Error, result: any)=>void): ChildProcess {
    cbStatus = this.checkCallback(cbStatus);
    cbFinal = this.checkCallback(cbFinal);
    let stderrText = '';
    //console.log(`Spawning: ${cmd} : ${args}`);
    let childProcess = spawn(cmd, args);
    childProcess.stderr.on('data', (dataChunk: Uint8Array) => {
      stderrText += dataChunk.toString();
    });
    childProcess.stdout.on('data', (dataChunk: Uint8Array) => {
      try {
        cbStatus(null, dataChunk);
      } catch (err) {
        let e = err;
      }
    });
    childProcess.on('error', (code: number) => {
      let c = code;
    });
    childProcess.on('close', (code: number, signal: string) => {
      if (code) {
        cbFinal(new Error(`exitCode: ${code}, signal: ${signal}, stderr: ${stderrText}`), null);
      } else {
        cbFinal(null, null);
      }
    });
    return childProcess;
  }
}
