import { SystemBuilder } from './system-builder';
import type ECSpresso from './ecspresso';
/**
 * Bundle class that encapsulates a set of components, resources, events, and systems
 * that can be merged into a ECSpresso instance
 */
export default class Bundle<ComponentTypes extends Record<string, any> = {}, EventTypes extends Record<string, any> = {}, ResourceTypes extends Record<string, any> = {}> {
    private _systems;
    private _resources;
    private _id;
    constructor(id?: string);
    /**
     * Get the unique ID of this bundle
     */
    get id(): string;
    /**
     * Set the ID of this bundle
     * @internal Used by combineBundles
     */
    set id(value: string);
    /**
     * Add a system to this bundle
     */
    addSystem(label: string): import("./system-builder").SystemBuilderWithBundle<ComponentTypes, EventTypes, ResourceTypes, {}>;
    /**
     * Add a resource to this bundle
     * @param label The resource key
     * @param resource The resource value or a factory function that returns the resource
     */
    addResource<K extends keyof ResourceTypes>(label: K, resource: ResourceTypes[K] | ((ecs: ECSpresso<ComponentTypes, EventTypes, ResourceTypes>) => ResourceTypes[K] | Promise<ResourceTypes[K]>)): this;
    /**
     * Get all systems defined in this bundle
     * Returns built System objects instead of SystemBuilders
     */
    getSystems(): SystemBuilder<ComponentTypes, EventTypes, ResourceTypes, any>[];
    /**
     * Register all systems in this bundle with an ECSpresso instance
     * @internal Used by ECSpresso when adding a bundle
     */
    registerSystemsWithEcspresso(ecspresso: ECSpresso<ComponentTypes, EventTypes, ResourceTypes>): void;
    /**
     * Get all resources defined in this bundle
     */
    getResources(): Map<keyof ResourceTypes, ResourceTypes[keyof ResourceTypes]>;
    /**
     * Get a specific resource by key
     * @param key The resource key
     * @returns The resource value or undefined if not found
     */
    getResource<K extends keyof ResourceTypes>(key: K): ResourceTypes[K];
    /**
     * Get all system builders in this bundle
     */
    getSystemBuilders(): SystemBuilder<ComponentTypes, EventTypes, ResourceTypes, any>[];
    /**
     * Check if this bundle has a specific resource
     * @param key The resource key to check
     * @returns True if the resource exists
     */
    hasResource<K extends keyof ResourceTypes>(key: K): boolean;
}
type Exactly<T, U> = T extends U ? U extends T ? true : false : false;
type IncompatibleBundles<C1 extends Record<string, any>, C2 extends Record<string, any>, E1 extends Record<string, any>, E2 extends Record<string, any>, R1 extends Record<string, any>, R2 extends Record<string, any>> = {
    [K in keyof C1 & keyof C2]: Exactly<C1[K], C2[K]> extends false ? never : unknown;
} & {
    [K in keyof E1 & keyof E2]: Exactly<E1[K], E2[K]> extends false ? never : unknown;
} & {
    [K in keyof R1 & keyof R2]: Exactly<R1[K], R2[K]> extends false ? never : unknown;
};
/**
 * Function that merges multiple bundles into a single bundle
 */
export declare function mergeBundles<C1 extends Record<string, any>, E1 extends Record<string, any>, R1 extends Record<string, any>, C2 extends Record<string, any>, E2 extends Record<string, any>, R2 extends Record<string, any>>(id: string, bundle1: Bundle<C1, E1, R1>, bundle2: Bundle<C2, E2, R2> & IncompatibleBundles<C1, C2, E1, E2, R1, R2>): Bundle<C1 & C2, E1 & E2, R1 & R2>;
export declare function mergeBundles<ComponentTypes extends Record<string, any>, EventTypes extends Record<string, any>, ResourceTypes extends Record<string, any>>(id: string, ...bundles: Array<Bundle<ComponentTypes, EventTypes, ResourceTypes>>): Bundle<ComponentTypes, EventTypes, ResourceTypes>;
export {};
