import { CliTerseError } from '@alwaysai/alwayscli';
import * as chalk from 'chalk';
import * as logSymbols from 'log-symbols';
import { confirmPromptComponent } from './confirm-prompt-component';

import { echo, echoCommandInvocation } from '../../util/echo';

export async function runWithEchoAndProceedPrompt<TArgs extends any[]>(
  func: (...args: TArgs) => any,
  args: TArgs,
  props: { yes?: boolean; functionName?: string } = {}
) {
  const { yes = false, functionName } = props;
  const commandString = `${functionName ?? func.name} ${args.join(' ')}`;
  echoCommandInvocation(commandString);
  const result = await func(...args);
  let endOfCommandMessage = `End of "${commandString}"`;
  if (typeof result !== 'undefined') {
    endOfCommandMessage = `${endOfCommandMessage} (result=${result})`;
  }
  if (!yes) {
    const confirmed = await confirmPromptComponent({
      message: `${endOfCommandMessage}. Proceed?`
    });
    if (!confirmed) {
      throw new CliTerseError('User elected not to proceed');
    }
  } else {
    echo(`${logSymbols.success} ${chalk.bold(endOfCommandMessage)}`);
  }
  echo();
}
