import prompts from 'prompts';
import logger from '../shared/logger';
import { onPromptsCancel } from '../shared/utils';
import { loadCliConfig } from './base';
import createComponentAction from './create-component';
import createLibEntryAction from './create-lib-entry';

export type CreateCMD = {
  config?: string;
  type?: keyof typeof CREATE_TYPE_ACTION;
  core?: boolean;
  service?: boolean;
  directive?: boolean;
  force?: boolean;
};

const CREATE_TYPES = ['component', 'component-test', 'component-doc', 'lib-entry', 'doc-nav'];
const UNFINISHED_CREATE_TYPES = ['component-test', 'component-doc', 'doc-nav'];
const CREATE_TYPE_ACTION = {
  component: createComponentAction,
  'lib-entry': createLibEntryAction
};

export function validateCreateType(type: string) {
  const valid = CREATE_TYPES.includes(type);

  if (!valid) {
    logger.error(`Create type error!.`);
    logger.info(
      `Optional type list: ${CREATE_TYPES.map((type) =>
        UNFINISHED_CREATE_TYPES.includes(type) ? `${type}(Unfinished)` : type
      ).join(', ')}`
    );
  }

  return valid ? type : '';
}

export default async function createAction(names: string[] = [], cmd: CreateCMD = {}) {
  loadCliConfig(cmd);

  let { type } = cmd;

  if (!type) {
    try {
      const result = await prompts(
        [
          {
            name: 'type',
            type: 'select',
            message: 'Please select a type.',
            choices: CREATE_TYPES.map((value, index) => ({
              title: value,
              value,
              selected: index === 0
            }))
          }
        ],
        {
          onCancel: onPromptsCancel
        }
      );

      type = result.type;
    } catch (e: any) {
      logger.error(e.message);
      process.exit(1);
    }
  }

  const action = CREATE_TYPE_ACTION[type!];
  if (action) {
    action(names, cmd);
  } else {
    logger.warn('Sorry! The type is not completed.');
  }
}