import { writeFileSync, existsSync } from 'fs';
import { CliTerseError } from '@alwaysai/alwayscli';

import { confirmWriteFilePromptComponent } from '../general';
import {
  Spinner,
  UnableToProceedWithoutMessage,
  downloadJson
} from '../../util';
import { getSystemId } from '../../infrastructure';
import { DOCKER_EDGEIQ_REPOSITORY_NAME } from '../../constants';
import { DOCKERFILE } from '../../paths';

const WRITE_MESSAGE = `Write ${DOCKERFILE}`;
const FOUND_MESSAGE = `Found ${DOCKERFILE}`;
export async function findOrWriteDockerfileComponent(props: { yes: boolean }) {
  const { yes } = props;
  if (existsSync(DOCKERFILE)) {
    Spinner(FOUND_MESSAGE).succeed();
  } else {
    // !exists
    const confirmed =
      yes || (await confirmWriteFilePromptComponent({ fileName: DOCKERFILE }));
    if (!confirmed) {
      throw new CliTerseError(UnableToProceedWithoutMessage(DOCKERFILE));
    }
    const spinner = Spinner(WRITE_MESSAGE);
    let bucket: string;
    switch (getSystemId()) {
      case 'development': {
        bucket = 'alwaysai-artifacts-dev';
        break;
      }
      case 'qa': {
        bucket = 'alwaysai-artifacts-qa';
        break;
      }
      case 'production':
      case 'local':
      default:
        bucket = 'alwaysai-artifacts-prod';
    }
    const parsed: { version: string; docker: string } = await downloadJson(
      `https://${bucket}.s3.us-west-1.amazonaws.com/edgeiq/edgeiq.json`
    );
    const version = parsed.docker;
    try {
      writeFileSync(
        DOCKERFILE,
        `ARG ALWAYSAI_HW="default"\nFROM ${DOCKER_EDGEIQ_REPOSITORY_NAME}:$\{ALWAYSAI_HW}-${version}\n`,
        {
          flag: 'wx'
        }
      );
      spinner.succeed();
    } catch (exception) {
      if (exception.code === 'EEXIST') {
        // Unlikely scenario that the file did not exist but now does
        spinner.succeed(FOUND_MESSAGE);
      } else {
        spinner.fail();
        throw exception;
      }
    }
  }
}
