import { rimraf } from 'rimraf';

import { CliBranch, CliLeaf, CliOneOfInput } from '@alwaysai/alwayscli';
import { ALWAYSAI_CLI_EXECUTABLE_NAME, SYSTEM_IDS } from '../../constants';
import { Spinner, echo } from '../../util';
import { getSystemId, setSystemId } from '../../infrastructure';
import { ALWAYSAI_SHOW_HIDDEN, ALWAYSAI_SYSTEM_ID } from '../../environment';
import { LOCAL_AAI_CFG_DIR } from '../../paths';
import * as logSymbols from 'log-symbols';

const show = CliLeaf({
  name: 'show',
  description: `Show your current "${ALWAYSAI_CLI_EXECUTABLE_NAME}" configuration`,
  action() {
    if (ALWAYSAI_SYSTEM_ID) {
      echo(
        `${logSymbols.warning} System ID is overridden by environment variable "ALWAYSAI_SYSTEM_ID"`
      );
    }
    return { systemId: getSystemId() };
  }
});

const set = CliLeaf({
  name: 'set',
  description: `Set an "${ALWAYSAI_CLI_EXECUTABLE_NAME}" configuration value`,
  namedInputs: {
    systemId: CliOneOfInput({ values: SYSTEM_IDS, required: true })
  },
  action(_, { systemId }) {
    if (ALWAYSAI_SYSTEM_ID) {
      echo(
        `${logSymbols.warning} System ID is overridden by environment variable "ALWAYSAI_SYSTEM_ID"`
      );
    }
    return setSystemId(systemId);
  }
});

function purgeConfig(path) {
  const spinner = Spinner('Removing the configuration files');
  try {
    rimraf.sync(path);
    spinner.succeed();
  } catch (exception) {
    spinner.fail();
    throw exception;
  }
}

const purge = CliLeaf({
  name: 'purge',
  description: 'Purge config files and credentials.',
  action(_) {
    purgeConfig(LOCAL_AAI_CFG_DIR);
  }
});

export const config = CliBranch({
  name: 'config',
  hidden: !ALWAYSAI_SHOW_HIDDEN,
  description: `Show, set, or purge "${ALWAYSAI_CLI_EXECUTABLE_NAME}" configuration values`,
  subcommands: [show, set, purge]
});

export const testSuiteFuncs = {
  purgeConfig
};
