import { Context, Service } from 'koishi';
import { Config } from '../config';
import { UploadManager } from '../storage';
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 _emojiStorage;
    private _categories;
    private _isInitialized;
    private _readyPromise;
    private _readyResolve;
    private _isDisposed;
    private _uploadManager;
    private _aiAnalyzer;
    constructor(ctx: Context, config: Config);
    get ready(): Promise<void>;
    get uploadManager(): UploadManager;
    private initializeStorage;
    get isInitialized(): boolean;
    categorizeEmoji(imageBase64: string): Promise<AICategorizeResult | null>;
    analyzeEmoji(imageBase64: string): Promise<AIAnalyzeResult | null>;
    filterImageByType(imageBase64: string): Promise<AIImageFilterResult | null>;
    addEmoji(options: EmojiAddOptions, source: Buffer | {
        path: string;
    }, aiAnalysis?: boolean): Promise<EmojiItem>;
    addEmojis(emojis: {
        options: EmojiAddOptions;
        buffer: Buffer;
    }[], aiAnalysis: boolean): Promise<EmojiItem[]>;
    getEmojiByName(name: string): Promise<EmojiItem | null>;
    getEmojisByName(name: string): Promise<EmojiItem[]>;
    getEmojiById(id: string): Promise<EmojiItem | null>;
    private filterEmojis;
    getEmojiList(options?: EmojiSearchOptions): Promise<EmojiItem[]>;
    getEmojiPage(options?: EmojiSearchOptions): Promise<PaginatedResult<EmojiItem>>;
    searchEmoji(keyword: string): Promise<EmojiItem[]>;
    deleteEmoji(id: string): Promise<boolean>;
    deleteAllEmojis(): Promise<boolean>;
    updateEmojiInfo(id: string, updates: Partial<Pick<EmojiItem, 'name' | 'category' | 'tags'>>): Promise<boolean>;
    updateEmojiName(id: string, name: string): Promise<boolean>;
    updateEmojiTags(id: string, tags: string[]): Promise<boolean>;
    updateEmojiCategory(id: string, category: string): 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>;
    cleanupEmptyCategories(): Promise<number>;
    private buildTagUsageMap;
    getAllTags(): Promise<string[]>;
    getTagsPage(options?: TagSearchOptions): Promise<PaginatedResult<TagInfo>>;
    cleanupEmptyTags(): Promise<number>;
    categorizeExistingEmojis(): Promise<{
        success: number;
        failed: number;
    }>;
    private static readonly SUPPORTED_EXTENSIONS;
    scanFolder(folderPath: string): Promise<FolderScanResult>;
    private scanFolderRecursive;
    private emojiNameExists;
    importFromFolder(options: FolderImportOptions): Promise<FolderImportResult>;
    private updateCategoryEmojiCount;
    private loadEmojis;
    private loadCategories;
    getEmojiCount(): number;
    getCategoryCount(): number;
    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[];
}
