import StorageManagerStatic from '../../managers/StorageManagerStatic.cjs';
import ExportedStorage from '../export/ExportedStorage.cjs';
import { StorageElementType } from '../../types/StorageElementType.cjs';

interface StorageManagerInterface {
    /**
     * Get the CacheableMemory storage.
     * CacheableMemory is a cache system that can be used to store data in memory.
     * You can read more about it here: https://cacheable.org/docs/cacheable/#cacheablememory---in-memory-cache
     */
    readonly storage: Map<string, StorageElementType>;
    /**
     * System-reserved storage keys
     */
    readonly keysSystem: typeof StorageManagerStatic.keysSystem;
    /**
     * Set the starting storage. The starting storage that will be used when the game starts.
     * By default, the starting storage is empty.
     */
    set startingStorage(value: {
        [key: string]: StorageElementType;
    });
    /**
     * Set a variable in the storage
     * @param key The key of the variable
     * @param value The value of the variable. If undefined, the variable will be removed
     * @returns
     */
    setVariable(key: string, value: StorageElementType): void;
    /**
     * Get a variable from the storage. If the variable is a temporary variable, it will return the temporary variable
     * @param key The key of the variable
     * @returns The value of the variable. If the variable does not exist, it will return undefined
     */
    getVariable<T extends StorageElementType>(key: string): T | undefined;
    /**
     * Remove a variable from the storage
     * @param key The key of the variable
     * @returns
     */
    removeVariable(key: string): void;
    /**
     * Set a variable in the temporary storage. The lifespan of the variable is the number of opened labels.
     * To get the temporary variable, use {@link getVariable}
     * @param key The key of the temporary variable
     * @param value The value of the temporary variable. If undefined, the variable will be removed
     * @returns
     */
    setTempVariable(key: string, value: StorageElementType): void;
    /**
     * Remove a temporary variable
     * @param key The key of the temporary variable
     */
    removeTempVariable(key: string): void;
    /**
     * Set a flag to true or false.
     * @param name The name of the flag
     * @param value The value of the flag.
     */
    setFlag(name: string, value: boolean): void;
    /**
     * Get the value of a flag
     * @param name The name of the flag
     * @returns The value of the flag
     */
    getFlag(name: string): boolean;
    /**
     * Clear the storage and the oidsUsed
     * @returns
     */
    clear(): void;
    /**
     * Export the storage to a JSON string
     * @returns The JSON string
     */
    exportJson(): string;
    /**
     * Export the storage to an object
     * @returns The object
     */
    export(): ExportedStorage;
    /**
     * Import the storage from a JSON string
     * @param dataString The JSON string
     */
    importJson(dataString: string): void;
    /**
     * Import the storage from an object
     * @param data The object
     */
    import(data: ExportedStorage): void;
}

export type { StorageManagerInterface as default };
