import { spawn } from 'child_process';
import path from 'path';
import fs from 'fs';

const testFile = path.join(__dirname, '..', '..', '.testfile.txt');

const FAST_TEXT = path.join(__dirname, '..', '..', 'fastText', 'fastText');

/**
 * Executes a fast text function. If predicting then use test data
 *
 * @export
 * @param {string} args Arguments to fasttext method
 * @param {string} testData Test string
 * @returns {Promise} A promise which resolves the stdout of the function
 */
export default function execute(args, testData = '') {
  return new Promise((resolve, reject) => {
    let stdoutData = '';
    let stdErrorData = '';
    const fasttext = spawn(`${FAST_TEXT}`, args.split(' '));

    if (args.indexOf('predict') !== -1 || args.indexOf('test ') !== -1) {
      fs.writeFileSync(testFile, testData);
      const r = fs.createReadStream(testFile);
      r.pipe(fasttext.stdin);
    }
    fasttext.stdout.on('data', data => {
      stdoutData += data;
    });
    fasttext.stderr.on('data', err => {
      stdErrorData += err;
    });

    fasttext.stdout.on('end', () => {
      resolve(stdoutData || stdErrorData);
    });

    fasttext.stderr.on('end', () => {
      resolve({ stderr: stdErrorData || stdoutData, stdout: stdoutData });
    });
  });
}