import { posix } from 'path';
import * as logSymbols from 'log-symbols';
import { CliTerseError } from '@alwaysai/alwayscli';
import { APP_MODELS_DIRECTORY_NAME } from '../../../paths';
import { AppJsonFile, TargetJsonFile } from '../../../core/app';
import { ModelId } from '../../../core/model';
import { logger, echo, stringifyError } from '../../../util';
import { removeModelFromProject } from '../../project';

export async function appModelsRemoveComponent(props: {
  id: string;
  purge: boolean;
  removeFromProject: boolean;
}) {
  const { id, purge, removeFromProject } = props;
  const appJsonFile = AppJsonFile();
  const models = appJsonFile.read().models;
  if (!models || Object.keys(models).indexOf(id) === -1) {
    throw new CliTerseError(`Model ${id} not part of application config!`);
  }
  appJsonFile.removeModel(id);

  let success = true;
  if (purge) {
    const { publisher, name } = ModelId.parse(id);
    const modelDir = posix.join(APP_MODELS_DIRECTORY_NAME, publisher, name);
    const targetJsonFile = TargetJsonFile();
    try {
      const targetSpawner = targetJsonFile.readHostSpawner();
      await targetSpawner.rimraf(modelDir);
    } catch (error) {
      logger.error(stringifyError(error));
      success = false;
      echo(`${logSymbols.error} Failed to purge model package: ${error}`);
    }
  }

  if (removeFromProject) {
    try {
      await removeModelFromProject(id);
    } catch (error) {
      logger.error(stringifyError(error));
      success = false;
      echo(`${logSymbols.error} Failed to purge model package: ${error}`);
    }
  }
  if (!success) {
    throw new CliTerseError(`Failed during process of removing ${id}`);
  }
  echo(`${logSymbols.success} Remove ${id}`);
}
