/**
 * Element manager interface for handling element operations.
 * Each element type should have a corresponding manager implementation.
 */
import { IElement, ElementValidationResult } from './IElement.js';
import { ElementType } from '../../portfolio/types.js';
export interface IElementManager<T extends IElement> {
    load(path: string): Promise<T>;
    save(element: T, path: string): Promise<void>;
    delete(path: string): Promise<void>;
    exists(path: string): Promise<boolean>;
    list(): Promise<T[]>;
    find(predicate: (element: T) => boolean): Promise<T | undefined>;
    findMany(predicate: (element: T) => boolean): Promise<T[]>;
    validate(element: T): ElementValidationResult;
    validatePath(path: string): boolean;
    getElementType(): ElementType;
    getFileExtension(): string;
    importElement(data: string, format?: 'json' | 'yaml' | 'markdown'): Promise<T>;
    exportElement(element: T, format?: 'json' | 'yaml' | 'markdown'): Promise<string>;
}
export interface IElementFactory<T extends IElement> {
    create(metadata: Partial<T['metadata']>): T;
    createFromTemplate(templateId: string, overrides?: Partial<T>): Promise<T>;
    getDefaultMetadata(): T['metadata'];
}
export interface IElementLifecycleManager<T extends IElement> {
    activate(element: T): Promise<void>;
    deactivate(element: T): Promise<void>;
    isActive(element: T): boolean;
    getActiveElements(): T[];
    suspend(element: T): Promise<void>;
    resume(element: T): Promise<void>;
    onActivate(handler: (element: T) => void): void;
    onDeactivate(handler: (element: T) => void): void;
    onStatusChange(handler: (element: T, oldStatus: string, newStatus: string) => void): void;
}
export interface IBatchOperations<T extends IElement> {
    loadMany(paths: string[]): Promise<T[]>;
    saveMany(elements: Map<string, T>): Promise<void>;
    deleteMany(paths: string[]): Promise<void>;
    validateMany(elements: T[]): Map<T, ElementValidationResult>;
}
export interface IElementSearch<T extends IElement> {
    search(query: string): Promise<T[]>;
    searchByTag(tag: string): Promise<T[]>;
    searchByAuthor(author: string): Promise<T[]>;
    filter(criteria: FilterCriteria<T>): Promise<T[]>;
}
export interface FilterCriteria<T extends IElement> {
    type?: ElementType;
    tags?: string[];
    author?: string;
    minRating?: number;
    maxRating?: number;
    hasReferences?: boolean;
    custom?: (element: T) => boolean;
}
export interface IElementVersioning<T extends IElement> {
    getVersion(element: T): string;
    incrementVersion(element: T, type: 'major' | 'minor' | 'patch'): T;
    compareVersions(v1: string, v2: string): -1 | 0 | 1;
    isCompatible(element: T, constraint: string): boolean;
}
//# sourceMappingURL=IElementManager.d.ts.map