/// <reference types="@rbxts/compiler-types" />
import { ZrValue } from "@rbxts/zirconium/out/Data/Locals";
import { ZirconAfterContext, ZirconBeforeContext } from "./ZirconContext";
import { ZirconEnum } from "./ZirconEnum";
import { ZirconFunction } from "./ZirconFunction";
import { ZirconGroupBuilder, ZirconGroupConfiguration } from "./ZirconGroupBuilder";
import { ZirconNamespace } from "./ZirconNamespace";
import { ZirconValidator } from "./ZirconTypeValidator";
export declare type ZirconGlobal = ZirconNamespace | ZirconEnum<any> | ZirconFunction<any, any>;
export declare type ZirconScopedGlobal = readonly [
    type: ZirconNamespace | ZirconEnum<any> | ZirconFunction<any, any>,
    groups: readonly string[]
];
export declare enum ExecutionAction {
    Execute = 0,
    Skip = 1
}
export interface Hooks {
    BeforeExecute: (context: ZirconBeforeContext) => ExecutionAction;
    AfterExecute: (context: ZirconAfterContext) => void;
}
declare type MappedArray<T> = {
    [P in keyof T]: ReadonlyArray<T[P]>;
};
export interface ZirconConfiguration {
    readonly Groups: readonly ZirconGroupConfiguration[];
    /** @deprecated */
    readonly Registry: ZirconScopedGlobal[];
    readonly GroupGlobalsMap: ReadonlyMap<string, ZirconGlobal>;
    readonly Hooks: MappedArray<Hooks>;
}
export declare const enum ZirconDefaultGroup {
    Admin = "admin",
    User = "user",
    Creator = "creator"
}
export interface DefaultAdminGroupOptions {
    readonly GroupRank: number;
    readonly GroupId?: number;
}
export interface DefaultUserGroupOptions {
    readonly CanAccessConsole: boolean;
}
export declare class ZirconConfigurationBuilder {
    configuration: Writable<ZirconConfiguration>;
    constructor();
    /**
     * Creates a group, given the specified configuration
     * @param rank The rank. This is used for group priority
     * @param id The id of the group to create
     * @param configurator The configuration
     */
    CreateGroup(rank: number, id: string, configurator: (group: ZirconGroupBuilder) => ZirconGroupBuilder): this;
    /**
     * Creates a default `creator` group. This will refer to either the game creator, or group creator.
     * @returns
     */
    CreateDefaultCreatorGroup(): ZirconConfigurationBuilder;
    /**
     * Creates a default `admin` group.
     *
     * If this place is a group-owned place, and no arguments are provided anyone in the group
     * with a rank equal or higher to `254` is considered an administrator.
     *
     * If this isn't a group game, or you want a custom rule for `admin` you need to provide a configuration callback
     * @returns
     */
    CreateDefaultAdminGroup(): ZirconConfigurationBuilder;
    CreateDefaultAdminGroup(builder: (group: ZirconGroupBuilder) => ZirconGroupBuilder): ZirconConfigurationBuilder;
    CreateDefaultAdminGroup(options: DefaultAdminGroupOptions): ZirconConfigurationBuilder;
    /**
     * Creates a default `user` group, this refers to _anyone_ and shouldn't be used for more sensitive things.
     * @returns
     */
    CreateDefaultUserGroup(options?: DefaultUserGroupOptions): ZirconConfigurationBuilder;
    /**
     * Adds the specified namespace to Zircon
     * @param namespace The namespace
     * @param groups The groups this namespace is available to
     */
    AddNamespace(namespace: ZirconNamespace, groups: readonly string[]): this;
    /**
     * Adds the specified enum to Zircon
     * @param enumType The enum
     * @param groups The groups this enum is available to
     */
    AddEnum<K extends string>(enumType: ZirconEnum<K>, groups: readonly string[]): this;
    /**
     * Adds the specified function to Zircon
     * @param functionType The function
     * @param groups The groups this function is available to
     */
    AddFunction<A extends readonly ZirconValidator<any, any>[], R extends ZrValue | void = void>(functionType: ZirconFunction<A, R>, groups: readonly string[]): this;
    /**
     * Adds the specified function to Zircon
     * @param functionType The function
     * @param groupIds The groups this function is available to
     * @deprecated
     */
    AddFunctionsToGroups(functions: readonly ZirconFunction<any, any>[], groupIds: readonly string[]): this;
    /**
     * Returns a logging configuration, which creates a `creator` group with the permission to read server output, and a `user` group.
     * @returns
     */
    static logging(): ZirconConfiguration;
    /**
     * Returns a default configuration, which includes the `creator`, `admin`, and `user` groups.
     */
    static default(): ZirconConfigurationBuilder;
    Build(): ZirconConfiguration;
}
export {};
