import ora = require('ora');
import { NODE_ENV } from '../environment';
import { audit } from './audit';

type Spinner = {
  fail: (message?: string) => void;
  succeed: (message?: string) => void;
  warn: (message?: string) => void;
  setMessage: (message: string) => void;
};

export function Spinner(message: string) {
  audit(`Spinner: ${message}`);
  let spinner: Spinner;
  if (NODE_ENV === 'test') {
    spinner = {
      fail(message) {
        console.log(`Spinner test: ${message}`);
      },
      succeed(message) {
        console.log(`Spinner test: ${message}`);
      },
      warn(message) {
        console.log(`Spinner test: ${message}`);
      },
      setMessage(message) {
        console.log(`Spinner test: ${message}`);
      }
    };
  } else {
    const oraSpinner = ora({ text: message, discardStdin: false }).start();
    spinner = {
      fail(message) {
        oraSpinner.fail(message);
      },
      warn(message) {
        oraSpinner.warn(message);
      },
      succeed(message) {
        oraSpinner.succeed(message);
      },
      setMessage(message) {
        oraSpinner.text = message;
      }
    };
  }
  return spinner;
}
