import IFile from "../storage/IFile";
import ILevelDbFileInfo from "./ILevelDbFileInfo";
/**
 * Represents metadata about a single LDB file's index without loading full data.
 * Used for lazy-loading to determine which files might contain a requested key.
 */
export interface ILevelDbFileIndex {
    /** The file info including level and index */
    fileInfo: ILevelDbFileInfo;
    /** Smallest key in this file (from manifest) */
    smallestKey?: string;
    /** Largest key in this file (from manifest) */
    largestKey?: string;
    /** Whether this file has been fully loaded */
    isLoaded: boolean;
    /** Priority for loading (higher level files have lower priority) */
    priority: number;
}
/**
 * Represents metadata about a LOG file for lazy loading.
 * LOG files contain the most recent writes and take priority.
 */
export interface ILevelDbLogIndex {
    /** The log file */
    file: IFile;
    /** File name/index for sorting */
    name: string;
    /** Whether this file has been loaded */
    isLoaded: boolean;
}
/**
 * Represents a key location for on-demand loading.
 * Tracks where a key can be found without loading its data.
 */
export interface IKeyLocation {
    /** The file containing this key (LDB or LOG) */
    file: IFile;
    /** Whether this is from a LOG file (higher priority) */
    isLogFile: boolean;
    /** The file level (for LDB files, lower = newer) */
    fileLevel: number;
    /** The file index */
    fileIndex: number;
}
/**
 * LevelDbIndex manages metadata about LevelDB files to enable lazy loading.
 *
 * Instead of loading all files upfront, this class:
 * 1. Parses the MANIFEST to understand file metadata
 * 2. Tracks key ranges per file for efficient lookup
 * 3. Enables on-demand loading of specific files when keys are requested
 *
 * This dramatically reduces initial memory usage for large worlds.
 */
export default class LevelDbIndex {
    /** Indexed LDB files with metadata */
    ldbFileIndexes: ILevelDbFileIndex[];
    /** Indexed LOG files with metadata */
    logFileIndexes: ILevelDbLogIndex[];
    /** Map of file index to file info for quick lookup */
    filesByIndex: Map<number, ILevelDbFileIndex>;
    /** Deleted file numbers from manifest */
    deletedFileNumbers: Set<number>;
    /** Total number of files in the index */
    get totalFiles(): number;
    /** Number of files that have been loaded */
    get loadedFileCount(): number;
    /**
     * Initialize the index from manifest metadata.
     * This does NOT load any file contents - just organizes metadata.
     */
    initFromManifest(ldbFiles: IFile[], logFiles: IFile[], newFileLevel?: number[], newFileNumber?: number[], newFileSmallest?: string[], newFileLargest?: string[], deletedFileNumber?: number[]): void;
    /**
     * Find files that might contain a specific key based on key range metadata.
     * Returns files in priority order (LOG files first, then LDB by level).
     *
     * Note: This is a heuristic - if key ranges aren't available from manifest,
     * all files are considered potential matches.
     */
    findPotentialFilesForKey(key: string): Array<ILevelDbFileIndex | ILevelDbLogIndex>;
    /**
     * Get files that should be loaded for initial chunk enumeration.
     * This returns a subset of files that contain chunk metadata keys
     * (keys that are 9-14 bytes, which identify chunk coordinates).
     *
     * Returns files in the order they should be processed for correct supercession.
     */
    getFilesForChunkEnumeration(): Array<ILevelDbFileIndex | ILevelDbLogIndex>;
    /**
     * Mark a file as loaded.
     */
    markFileLoaded(file: IFile): void;
    /**
     * Check if all files have been loaded.
     */
    isFullyLoaded(): boolean;
    /**
     * Get unloaded files in priority order for background loading.
     */
    getUnloadedFiles(): Array<ILevelDbFileIndex | ILevelDbLogIndex>;
}
