import { CliTerseError } from '@alwaysai/alwayscli';
import { addModelToProject } from '../../project';
import { checkUserIsLoggedInComponent } from '../../user';
import { Spinner } from '../../../util';
import { CliRpcClient } from '../../../infrastructure';
import { AppJsonFile } from '../../../core/app';
import {
  downloadModelPackageToCache,
  modelPackageCache
} from '../../../core/model';

export async function appModelsAddComponent(props: {
  yes: boolean;
  dir?: string;
  id: string;
  version?: number;
  addToProject: boolean;
}) {
  const { yes, dir = process.cwd(), id, addToProject } = props;
  const appJsonFile = AppJsonFile(dir);
  appJsonFile.read();
  await checkUserIsLoggedInComponent({ yes });

  let modelVersion: number;
  const modelVersionStr = props.version ? `@${props.version}` : '';
  const spinner = Spinner(`Fetch model ${id}${modelVersionStr}`);
  try {
    if (props.version) {
      modelVersion = props.version;
    } else {
      const { version } = await CliRpcClient().getModelVersion({ id });
      modelVersion = version;
    }
    if (!modelPackageCache.has(id, modelVersion)) {
      await downloadModelPackageToCache(id, modelVersion);
    }
    spinner.succeed();
  } catch (exception) {
    spinner.fail();
    if (exception.code === 'MODEL_VERSION_NOT_FOUND') {
      throw new CliTerseError(`Model not found: ${id}${modelVersionStr}`);
    }
    throw exception;
  }
  if (addToProject) {
    await addModelToProject(id);
  }
  appJsonFile.addModel(id, modelVersion);
}
