import type { CliAction } from "../core/core.models.js";

export type CommandOptionNames =
	| "environmentId"
	| "help"
	| "deliveryApiKey"
	| "managementApiKey"
	| "outputDir"
	| "addTimestamp"
	| "moduleFileExtension"
	| "apiMode"
	| "contentTypes"
	| "managementBaseUrl"
	| "deliveryBaseUrl"
	| "entities"
	| "generateTypes"
	| "generateObjects";

export type CommandAlias = "h";

export interface Command<TAction extends string> {
	readonly name: TAction;
	readonly description: string;
	readonly options: readonly CommandOption[];
	readonly examples: readonly string[];
}

export interface CommandOption {
	readonly name: CommandOptionNames;
	readonly isRequired: boolean;
	readonly alias?: CommandAlias;
	readonly description?: string;
	readonly type?: "boolean" | "number" | "string";
}

export type CliArgumentsSetter<TAction extends string> = {
	withCommand(command: Command<TAction>): CliArgumentsSetter<TAction>;
	withOption(option: CommandOption): CliArgumentsSetter<TAction>;
	registerCommands(): void;
};

export type CliArgumentsFetcher = {
	getCliAction(): CliAction;
	getOptionalArgumentValue(argName: CommandOptionNames): string | undefined;
	getRequiredArgumentValue(argName: CommandOptionNames): string;
	getBooleanArgumentValue(argName: CommandOptionNames, defaultValue: boolean): boolean;
	getOptionalArgumentArrayValue(argName: CommandOptionNames): readonly string[];
};
