import { CliTerseError } from '@alwaysai/alwayscli';
import { confirmWriteFilePromptComponent } from '../general';
import { DOCKER_COMPOSE_FILE } from '../../paths';
import { JsSpawner, Spinner, UnableToProceedWithoutMessage } from '../../util';
import { DockerComposeCmd } from '../../util/docker';
import { writeDockerComposeFile } from '../../core/app';

const WRITE_MESSAGE = `Write ${DOCKER_COMPOSE_FILE}`;
const FOUND_MESSAGE = `Found ${DOCKER_COMPOSE_FILE}`;
export async function findOrWriteDockerComposeFileComponent(props: {
  yes: boolean;
  cmd: DockerComposeCmd;
}): Promise<boolean> {
  const { yes, cmd } = props;
  const spawner = JsSpawner();
  if (await spawner.exists(DOCKER_COMPOSE_FILE)) {
    Spinner(FOUND_MESSAGE).succeed();
    return true;
  }
  {
    // !exists
    const confirmed =
      yes ||
      (await confirmWriteFilePromptComponent({
        fileName: DOCKER_COMPOSE_FILE
      }));
    if (!confirmed) {
      throw new CliTerseError(
        UnableToProceedWithoutMessage(DOCKER_COMPOSE_FILE)
      );
    }
    const spinner = Spinner(WRITE_MESSAGE);
    try {
      await writeDockerComposeFile({ spawner, cmd });
      spinner.succeed();
      return false;
    } catch (exception) {
      if (exception.code === 'EEXIST') {
        // Unlikely scenario that the file did not exist but now does
        spinner.succeed(FOUND_MESSAGE);
        return true;
      }
      spinner.fail();
      throw exception;
    }
  }
}
