import { Schema, SchemaValues, SchemaPartialValues } from '@sprucelabs/schema';
import { GraphicsInterface } from '../types/cli.types';
import AbstractFeature from './AbstractFeature';
import FeatureInstaller from './FeatureInstaller';
import { FeatureCode, FeatureInstallResponse, FeatureAction, FeatureMap } from './features.types';
export default class ActionQuestionAskerImpl<F extends FeatureCode = FeatureCode> implements ActionQuestionAsker<F> {
    private ui;
    static Class?: new (options: ActionQuestionAskerOptions) => ActionQuestionAsker<any>;
    private featureInstaller;
    private actionCode;
    private feature;
    private shouldAutoHandleDependencies;
    protected constructor(options: ActionQuestionAskerOptions);
    static Asker(options: ActionQuestionAskerOptions): ActionQuestionAsker<any>;
    installOrMarkAsSkippedMissingDependencies(): Promise<FeatureInstallResponse>;
    private getDependenciesNotInstalled;
    askAboutMissingFeatureOptionsIfFeatureIsNotInstalled(isInstalled: boolean, options?: Record<string, any> & FeatureCommandExecuteOptions<F>): Promise<Record<string, any> & FeatureCommandExecuteOptions<F>>;
    askAboutMissingActionOptions<S extends Schema>(action: FeatureAction<S>, options?: Record<string, any> & FeatureCommandExecuteOptions<F>): Promise<SchemaValues<S> | undefined>;
    installOurFeature(installOptions: Record<string, any>): Promise<FeatureInstallResponse>;
    private renderHeading;
    private installOrMarkAsSkippedMissingDependency;
    private collectAnswers;
    private getCommandName;
    private generateConfirmInstallMessage;
}
type FeatureCommandExecuteOptions<F extends FeatureCode, S extends Schema | undefined = FeatureMap[F]['optionsSchema']> = S extends Schema ? SchemaPartialValues<S> : undefined;
interface ActionQuestionAskerOptions {
    ui: GraphicsInterface;
    featureInstaller: FeatureInstaller;
    actionCode: string;
    feature: AbstractFeature;
    shouldAutoHandleDependencies: boolean;
}
export type QuestionAskerOptionsOptions<F extends FeatureCode> = Record<string, any> & FeatureCommandExecuteOptions<F>;
export interface ActionQuestionAsker<F extends FeatureCode = FeatureCode> {
    installOrMarkAsSkippedMissingDependencies(): Promise<FeatureInstallResponse>;
    askAboutMissingFeatureOptionsIfFeatureIsNotInstalled(isInstalled: boolean, options?: QuestionAskerOptionsOptions<F>): Promise<Record<string, any> & FeatureCommandExecuteOptions<F>>;
    askAboutMissingActionOptions<S extends Schema>(action: FeatureAction<S>, options?: QuestionAskerOptionsOptions<F>): Promise<SchemaValues<S> | undefined>;
    installOurFeature(installOptions: Record<string, any>): Promise<FeatureInstallResponse>;
}
export {};
