import prompts from 'prompts';
import { PublicationData } from './readWritePublications';
import { PromptType } from 'prompts';

export interface PromptConfig {
  type: PromptType | ((prev: any) => PromptType | null),
  name: string,
  message: string,
  initial?: any,
  choices?: any,
  validate?: (value: any) => boolean | string,
  errorMsg?: string,
  process?: (value: string) => void,
}

const createPrompt = (promptConfig: PromptConfig): prompts.PromptObject => {
  const {process, errorMsg, ...promptOpts } = promptConfig;
  return {
    ...promptOpts,
    onState: ({ value, aborted, exited }) => {
      if(errorMsg && (aborted || exited)) {
        throw new Error(errorMsg);
      }
      if(process) process(value);
    }
  }
};

export const createPrompts = async (config: PublicationData, key: string, promptConfig: PromptConfig | PromptConfig[]) => {
   if(!config[key]) {
      const promptsArray = Array.isArray(promptConfig) ? promptConfig : [promptConfig];
      const values = await prompts(promptsArray.map(createPrompt));
      return {
        ...config,
        ...values
      }
    }
    return Promise.resolve(config);
}