import type { ApplicationCommandOptionData, PermissionResolvable, Collection, ClientOptions, Snowflake, LocalizationMap } from 'discord.js';
import type { EventEmitter } from 'node:events';
import type { ButtonsManager, CommandsManager, EventsManager, InhibitorsManager, ModalsManager, SelectMenusManager, Button, Command, Event, Inhibitor, SelectMenu, Modal } from '../index.js';
import type { CLIENT_MODE, COMMAND_CHANNEL, COMMAND_MESSAGE_ARGS_TYPE, COMMAND_TYPE, INHIBITOR_TYPE } from '../constants/constants.js';
import type { CommandManagerRegisterStrategy, CustomId, InhibitorType, MessageCommandPrefix } from './types.js';
/**
 * Interfaces of managers
 */
export interface BaseManagerOptions {
    directory: string;
    asyncRead?: boolean;
}
export interface CommandsManagerOptions extends BaseManagerOptions {
    guildId?: Snowflake | Snowflake[];
    prefix?: MessageCommandPrefix;
    applicationPermissions?: boolean;
    autoRegisterApplicationCommands?: boolean;
    default?: CommandsManagerDefaultOptions;
    registerStrategy?: CommandManagerRegisterStrategy;
}
export interface CommandsManagerDefaultOptions {
    adminOnly?: boolean;
    registerApplicationCommand?: boolean;
    category?: string;
    channel?: typeof COMMAND_CHANNEL.dm | typeof COMMAND_CHANNEL.global | typeof COMMAND_CHANNEL.guild;
    clientPermissions?: PermissionResolvable[];
    cooldown?: number;
    description?: string;
    descriptionLocalizations?: LocalizationMap;
    examples?: string | string[];
    type?: typeof COMMAND_TYPE.cmdSlash | typeof COMMAND_TYPE.cmdMsg | typeof COMMAND_TYPE.ctxMsg | typeof COMMAND_TYPE.ctxUser;
    usage?: string | string[];
    userPermissions?: PermissionResolvable[];
}
export interface EventsManagerOptions extends BaseManagerOptions {
    default?: EventsManagerDefaultOptions;
}
export interface EventsManagerDefaultOptions {
    emitter?: EventEmitter;
    once?: boolean;
}
export interface InhibitorsManagerOptions extends BaseManagerOptions {
    default?: InhibitorsManagerDefaultOptions;
}
export interface InhibitorsManagerDefaultOptions {
    priority?: number;
    type?: typeof INHIBITOR_TYPE.message[] | typeof INHIBITOR_TYPE.appCommand[] | typeof INHIBITOR_TYPE.button[] | typeof INHIBITOR_TYPE.select[] | typeof INHIBITOR_TYPE.all[];
}
export interface ButtonsManagerOptions extends BaseManagerOptions {
    default?: ButtonsManagerDefaultOptions;
}
export interface ButtonsManagerDefaultOptions {
    cooldown?: number;
}
export interface SelectMenusManagerOptions extends BaseManagerOptions {
    default?: SelectMenusManagerDefaultOptions;
}
export interface SelectMenusManagerDefaultOptions {
    cooldown?: number;
}
export interface ModalsManagerOptions extends BaseManagerOptions {
    default?: ModalsManagerDefaultOptions;
}
export interface ModalsManagerDefaultOptions {
    cooldown?: number;
}
interface BaseCommand {
    name: string;
    description?: string;
    category?: string;
    usage?: string | string[];
    enabled?: boolean;
    examples?: string | string[];
    channel?: typeof COMMAND_CHANNEL.dm | typeof COMMAND_CHANNEL.guild | typeof COMMAND_CHANNEL.global;
    cooldown?: number;
    adminsOnly?: boolean;
    registerApplicationCommand?: boolean;
    userPermissions?: PermissionResolvable[];
    clientPermissions?: PermissionResolvable[];
}
interface BaseApplicationCommand extends BaseCommand {
    nameLocalizations?: LocalizationMap;
    descriptionLocalizations?: LocalizationMap;
}
export interface SlashCommandData extends BaseApplicationCommand {
    descriptionLocalizations?: LocalizationMap;
    type?: typeof COMMAND_TYPE.cmdSlash;
    options?: ApplicationCommandOptionData[];
}
export interface ContextMenuUserData extends BaseApplicationCommand {
    type?: typeof COMMAND_TYPE.ctxUser;
}
export interface ContextMenuMessageData extends BaseApplicationCommand {
    type?: typeof COMMAND_TYPE.ctxMsg;
}
export interface MessageData extends BaseCommand {
    type?: typeof COMMAND_TYPE.cmdMsg;
    args?: MessageCommandOptionData[];
    aliases?: string[];
}
export interface MessageCommandOptionData {
    name: string;
    type: typeof COMMAND_MESSAGE_ARGS_TYPE.string | typeof COMMAND_MESSAGE_ARGS_TYPE.number | typeof COMMAND_MESSAGE_ARGS_TYPE.boolean | typeof COMMAND_MESSAGE_ARGS_TYPE.rest | typeof COMMAND_MESSAGE_ARGS_TYPE.guild | typeof COMMAND_MESSAGE_ARGS_TYPE.channel | typeof COMMAND_MESSAGE_ARGS_TYPE.member | typeof COMMAND_MESSAGE_ARGS_TYPE.guild_emoji | typeof COMMAND_MESSAGE_ARGS_TYPE.role | typeof COMMAND_MESSAGE_ARGS_TYPE.user | typeof COMMAND_MESSAGE_ARGS_TYPE.command;
    default?: unknown;
}
export interface CommandMessageArgsResolved {
    [index: string]: unknown;
}
export interface EventData {
    description?: string;
    emitter?: EventEmitter;
    once?: boolean;
}
export interface ButtonData {
    enabled?: boolean;
    cooldown?: number;
}
export interface ModalData {
    enabled?: boolean;
    cooldown?: number;
}
export interface SelectMenuData {
    enabled?: boolean;
    cooldown?: number;
}
export interface InhibitorData {
    enabled?: boolean;
    type?: InhibitorType[];
    priority?: number;
}
export interface ShewenyClientOptions extends ClientOptions {
    admins?: Snowflake[];
    disableCooldownsForAdmins?: boolean;
    joinThreadsOnCreate?: boolean;
    managers?: ManagersOptions;
    mode?: typeof CLIENT_MODE.dev | typeof CLIENT_MODE.prod;
}
export interface Cooldowns {
    commands: Collection<string, Collection<string, number>>;
    buttons: Collection<CustomId, Collection<string, number>>;
    selectMenus: Collection<CustomId, Collection<string, number>>;
    modals: Collection<CustomId, Collection<string, number>>;
}
export interface Managers {
    buttons?: ButtonsManager;
    commands?: CommandsManager;
    events?: EventsManager;
    inhibitors?: InhibitorsManager;
    modals?: ModalsManager;
    selectMenus?: SelectMenusManager;
}
export interface ManagersCollections {
    buttons: Collection<CustomId, Button[]>;
    commands: Collection<string, Command[]>;
    events: Collection<string, Event[]>;
    inhibitors: Collection<string, Inhibitor[]>;
    modals: Collection<CustomId, Modal[]>;
    selectMenus: Collection<CustomId, SelectMenu[]>;
}
interface ManagersOptions {
    commands?: CommandsManagerOptions;
    events?: EventsManagerOptions;
    buttons?: BaseManagerOptions;
    selectMenus?: BaseManagerOptions;
    modals?: BaseManagerOptions;
    inhibitors?: InhibitorsManagerOptions;
}
export {};
