import { CliTerseError } from '@alwaysai/alwayscli';
import { projectSelectComponent } from './project-select-component';
import { PLEASE_REPORT_THIS_ERROR_MESSAGE } from '../../constants';
import { Spinner } from '../../util';
import {
  ProjectJsonFile,
  requireUserIsCollaboratorOnProject
} from '../../core/project';
import { checkConfigFileExistsAndValid } from '../../util/config-file-exists-and-is-valid';
import { PROJECT_JSON_FILE_NAME } from '../../paths';

const WRITE_MESSAGE = `Write ${PROJECT_JSON_FILE_NAME}`;

export async function findOrWriteProjectJsonFileComponent(props: {
  yes: boolean;
  projectUuid?: string;
}) {
  const { yes } = props;
  const projectJsonFile = ProjectJsonFile();

  if (await checkConfigFileExistsAndValid(projectJsonFile)) {
    const storedProjectUuid = projectJsonFile.read().project.id;
    const projectUuid = props.projectUuid ?? storedProjectUuid;
    await requireUserIsCollaboratorOnProject(projectUuid);

    if (projectUuid !== storedProjectUuid) {
      const project = await projectSelectComponent({ yes: true, projectUuid });
      await writeProjectJsonFile(projectUuid, project.name.toString());
    }
  } else {
    const { projectUuid } = props;
    const project = await projectSelectComponent({ yes, projectUuid });
    if (!project.uuid) {
      throw new CliTerseError(
        `Invalid project! ${PLEASE_REPORT_THIS_ERROR_MESSAGE}`
      );
    }

    await writeProjectJsonFile(
      project.uuid.toString(),
      project.name.toString()
    );
  }
}

async function writeProjectJsonFile(projectUuid, projectName) {
  const projectJsonFile = ProjectJsonFile();
  const spinner = Spinner(WRITE_MESSAGE);
  try {
    projectJsonFile.write({
      project: {
        id: projectUuid,
        name: projectName
      }
    });
    spinner.succeed();
  } catch (exception) {
    spinner.fail();
    throw exception;
  }
}
