import { Context, Service } from 'koishi';
import { Config } from './config';
import { AIAnalyzeResult, AICategorizeResult, AIImageFilterResult, AITaskDetail, Category, CategorySearchOptions, EmojiAddOptions, EmojiItem, EmojiSearchOptions, FolderImportOptions, FolderImportResult, FolderScanResult, PaginatedResult, TagInfo, TagSearchOptions } from './types';
export declare class EmojiLunaService extends Service {
    config: Config;
    private static readonly AI_FRAME_SAMPLES;
    private _emojiStorage;
    private _categories;
    private _model;
    private _isInitialized;
    private _readyPromise;
    private _readyResolve;
    private _isDisposed;
    private _uploadManager;
    constructor(ctx: Context, config: Config);
    get ready(): Promise<void>;
    private initializeStorage;
    get isInitialized(): boolean;
    initializeAI(): Promise<void>;
    private parseAIResult;
    private buildAIImages;
    categorizeEmoji(imageBase64: string): Promise<AICategorizeResult | null>;
    analyzeEmoji(imageBase64: string): Promise<AIAnalyzeResult | null>;
    filterImageByType(imageBase64: string): Promise<AIImageFilterResult | null>;
    private calculateFileHash;
    addEmojiFromPath(options: EmojiAddOptions, sourcePath: string, aiAnalysis?: boolean): Promise<EmojiItem>;
    addEmoji(options: EmojiAddOptions, imageData: Buffer, aiAnalysis?: boolean): Promise<EmojiItem>;
    addEmojis(emojis: {
        options: EmojiAddOptions;
        buffer: Buffer;
    }[], aiAnalysis: boolean): Promise<EmojiItem[]>;
    private runAiAnalysisInBackground;
    private updateEmojiInfo;
    getEmojiByName(name: string): Promise<EmojiItem | null>;
    getEmojisByName(name: string): Promise<EmojiItem[]>;
    categorizeExistingEmojis(): Promise<{
        success: number;
        failed: number;
    }>;
    private filterEmojis;
    getEmojiList(options?: EmojiSearchOptions): Promise<EmojiItem[]>;
    getEmojiPage(options?: EmojiSearchOptions): Promise<PaginatedResult<EmojiItem>>;
    searchEmoji(keyword: string): Promise<EmojiItem[]>;
    getEmojiById(id: string): Promise<EmojiItem | null>;
    deleteEmoji(id: string): Promise<boolean>;
    deleteAllEmojis(): Promise<boolean>;
    addCategory(name: string, description?: string): Promise<Category>;
    getCategories(): Promise<Category[]>;
    getCategoriesPage(options?: CategorySearchOptions): Promise<PaginatedResult<Category>>;
    getCategoryByName(name: string): Promise<Category | null>;
    deleteCategory(id: string, deleteEmojis?: boolean): Promise<boolean>;
    getAllTags(): Promise<string[]>;
    getTagsPage(options?: TagSearchOptions): Promise<PaginatedResult<TagInfo>>;
    cleanupEmptyCategories(): Promise<number>;
    cleanupEmptyTags(): Promise<number>;
    updateEmojiTags(id: string, tags: string[]): Promise<boolean>;
    updateEmojiName(id: string, name: string): Promise<boolean>;
    updateEmojiCategory(id: string, category: string): Promise<boolean>;
    private loadEmojis;
    private loadCategories;
    getEmojiCount(): number;
    getCategoryCount(): number;
    private static readonly SUPPORTED_EXTENSIONS;
    /**
     * Scan a folder and return information about its contents
     */
    scanFolder(folderPath: string): Promise<FolderScanResult>;
    /**
     * Recursively scan a folder and collect all image files
     */
    private scanFolderRecursive;
    /**
     * Check if an emoji with the same name already exists
     */
    private emojiNameExists;
    /**
     * Import emojis from a local folder
     */
    importFromFolder(options: FolderImportOptions): Promise<FolderImportResult>;
    private updateCategoryEmojiCount;
    getAiTaskStats(): Promise<{
        pending: number;
        processing: number;
        succeeded: number;
        failed: number;
        paused: boolean;
    }>;
    getFailedAiEmojiIds(): Promise<string[]>;
    setAiPaused(paused: boolean): void;
    retryFailedTasks(): Promise<number>;
    reanalyzeBatch(ids: string[]): Promise<number>;
    getAiTasksAll(): Promise<AITaskDetail[]>;
    deleteAiTask(emojiId: string): Promise<void>;
    retryAiTask(emojiId: string): Promise<void>;
    static inject: string[];
}
