import { CliTerseError } from '@alwaysai/alwayscli';
import { APP_JSON_FILE_NAME } from '../../paths';
import { AppJsonFile } from '../../core/app';
import { Spinner, UnableToProceedWithoutMessage } from '../../util';
import { checkConfigFileExistsAndValid } from '../../util/config-file-exists-and-is-valid';
import { confirmWriteFilePromptComponent } from '../general';

const WRITE_MESSAGE = `Write ${APP_JSON_FILE_NAME}`;
const FOUND_MESSAGE = `Found ${APP_JSON_FILE_NAME}`;

export async function findOrWriteAppJsonFileComponent(props: { yes: boolean }) {
  const { yes } = props;
  const appJsonFile = AppJsonFile();
  if (!appJsonFile.exists()) {
    const confirmed =
      yes ||
      (await confirmWriteFilePromptComponent({
        fileName: APP_JSON_FILE_NAME,
        description: 'Configuration file'
      }));
    if (!confirmed) {
      throw new CliTerseError(
        UnableToProceedWithoutMessage(APP_JSON_FILE_NAME)
      );
    }
    try {
      appJsonFile.remove();
      appJsonFile.initialize();
      Spinner(WRITE_MESSAGE).succeed();
    } catch (exception) {
      Spinner(WRITE_MESSAGE).fail();
      throw exception;
    }
  } else if (await checkConfigFileExistsAndValid(appJsonFile)) {
    Spinner(FOUND_MESSAGE).succeed();
  }
  // if it exists but doesn't pass the checkConfigFileExistsAndValid, then it's syntax error.
  else {
    throw new CliTerseError(UnableToProceedWithoutMessage(APP_JSON_FILE_NAME));
  }
}
