import * as logSymbols from 'log-symbols';

import { buildDockerImage } from '../../util/docker/docker-cmd';
import { CliTerseError } from '@alwaysai/alwayscli';
import { Spawner, echo, logger, stringifyError } from '../../util';

export async function buildDockerImageComponent(props: {
  targetHostSpawner: Spawner;
  targetHardware?: string;
  dockerImageTag?: string;
  dockerfilePath?: string;
  pullBaseImage?: boolean;
}) {
  const {
    targetHostSpawner,
    targetHardware,
    dockerImageTag,
    dockerfilePath,
    pullBaseImage
  } = props;
  const dockerTagStr = dockerImageTag ? ` (tag=${dockerImageTag})` : '';
  const targetHardwareStr = targetHardware
    ? ` (ALWAYSAI_HW=${targetHardware})`
    : '';
  const BUILD_DOCKER_IMAGE_MESSAGE = `Build docker image${dockerTagStr}${targetHardwareStr}`;

  echo(`- ${BUILD_DOCKER_IMAGE_MESSAGE}`);
  try {
    const dockerImageId = await buildDockerImage({
      targetHostSpawner,
      targetHardware,
      dockerImageTag,
      dockerfilePath,
      pullBaseImage,
      runInForeground: true
    });
    echo(`${logSymbols.success} ${BUILD_DOCKER_IMAGE_MESSAGE}`);
    return dockerImageId;
  } catch (exception) {
    logger.error(stringifyError(exception));
    echo(`${logSymbols.error} ${BUILD_DOCKER_IMAGE_MESSAGE}`);
    throw new CliTerseError('Docker build failed! Check Docker logs.');
  }
}
