import { Compiler } from 'webpack';

interface DifyPluginOptions {
    /** Dify知识库ID */
    knowledgeBaseId: string;
    /** Dify API Token */
    apiToken: string;
    /** 项目名称，用作文档命名前缀 */
    projectName: string;
    /** 是否启用上传功能，通常在build场景下使用 */
    enableUpload?: boolean;
    /** 是否启用MDX文件分割 */
    enableSplit?: boolean;
    /** 分割标记，用于识别MDX文件中的分割点 */
    splitMarker?: string;
    /** 包含规则，支持glob模式 */
    include?: string[];
    /** 排除规则，支持glob模式 */
    exclude?: string[];
    /** Dify API基础URL */
    apiBaseUrl?: string;
    /** 分割时每个chunk的最大字符数 */
    maxChunkSize?: number;
    /** 超出最大分隔字数块需要保证在这个标志之前，支持正则表达式字符串 */
    maxChunkSplitBeforeMarker?: string;
    /** 处理规则 */
    process_rule?: ProcessRule;
}
interface ProcessRule {
    /** 清洗、分段模式 */
    mode: 'automatic' | 'custom';
    indexing_technique: 'high_quality' | 'economy';
    /** 自定义规则（自动模式下，该字段为空） */
    rules?: {
        /** 预处理规则 */
        pre_processing_rules?: PreProcessingRule[];
        /** 父分段的召回模式 */
        parent_mode?: 'full-doc' | 'paragraph';
        /** 分段规则 */
        segmentation?: SegmentationRule;
        /** 子分段规则 */
        subchunk_segmentation?: SubchunkSegmentationRule;
    };
    /** 文档类型 */
    doc_type?: DocumentType;
    /** 文档元数据（如提供文档类型则必填，字段因文档类型而异） */
    doc_metadata?: DocumentMetadata;
    /** 索引内容的形式 */
    doc_form: 'text_model' | 'hierarchical_model' | 'qa_model';
    /** 文档语言 */
    doc_language?: string;
}
interface PreProcessingRule {
    /** 预处理规则的唯一标识符 */
    id: 'remove_extra_spaces' | 'remove_urls_emails';
    /** 是否选中该规则，不传入文档 ID 时代表默认值 */
    enabled: boolean;
}
interface SegmentationRule {
    /** 自定义分段标识符，目前仅允许设置一个分隔符。默认为 \n */
    separator?: string;
    /** 最大长度（token）默认为 1000 */
    max_tokens?: number;
}
interface SubchunkSegmentationRule {
    /** 分段标识符，目前仅允许设置一个分隔符。默认为 */
    separator?: string;
    /** 最大长度 (token) 需要校验小于父级的长度 */
    max_tokens?: number;
    /** 分段重叠指的是在对数据进行分段时，段与段之间存在一定的重叠部分 */
    chunk_overlap?: number;
}
type DocumentType = 'book' | 'web_page' | 'paper' | 'social_media_post' | 'wikipedia_entry' | 'personal_document' | 'business_document' | 'im_chat_log' | 'synced_from_notion' | 'synced_from_github' | 'others';
interface DocumentMetadata {
    title?: string;
    language?: string;
    author?: string;
    publisher?: string;
    publication_date?: string;
    publish_date?: string;
    isbn?: string;
    category?: string;
    url?: string;
    topic?: string;
    keywords?: string;
    description?: string;
}
interface MDXFile {
    /** 文件路径 */
    path: string;
    /** 文件内容 */
    content: string;
    /** frontmatter数据 */
    frontmatter: Record<string, any>;
    /** 文档标题 */
    title: string;
    /** 菜单层级路径 */
    menuPath: string[];
}
interface DocumentChunk {
    /** chunk标识符 */
    id: string;
    /** chunk内容 */
    content: string;
    /** 文档名称 */
    name: string;
    /** chunk在文档中的序号 */
    index: number;
}
interface DifyDocument {
    /** 文档ID */
    id: string;
    /** 文档名称 */
    name: string;
    /** 创建时间 */
    created_at: string;
    /** 更新时间 */
    updated_at: string;
    /** 文档状态 */
    status: string;
}
interface DifyApiResponse<T = any> {
    /** 响应数据 */
    data: T;
    /** 是否成功 */
    success: boolean;
    /** 错误信息 */
    message?: string;
}
interface UploadResponse {
    /** 文档ID */
    document_id: string;
    /** 文档名称 */
    name: string;
    /** 操作类型：create或update */
    operation: 'create' | 'update';
}

declare class DifyClient {
    private client;
    private knowledgeBaseId;
    private documents;
    private process_rule;
    constructor(apiToken: string, knowledgeBaseId: string, baseURL: string | undefined, process_rule: ProcessRule);
    /**
     * 获取知识库中的所有文档
     */
    initDocuments(): Promise<DifyDocument[]>;
    /**
     * 获取文档
     */
    getDocuments(): Promise<DifyDocument[]>;
    /**
     * 根据文档名称查找文档
     */
    findDocumentByName(name: string): Promise<DifyDocument | null>;
    deleteModuleDocuments(moduleName: string): Promise<void>;
    /**
     * 删除文档
     */
    deleteDocument(documentId: string): Promise<void>;
    /**
     * 创建新文档
     */
    createDocument(name: string, content: string): Promise<UploadResponse>;
    /**
     * 更新现有文档
     */
    updateDocument(documentId: string, name: string, content: string): Promise<UploadResponse>;
    /**
     * 上传或更新文档
     */
    uploadDocument(name: string, content: string): Promise<UploadResponse>;
}

declare class MDXParser {
    private options;
    constructor(options: DifyPluginOptions);
    /**
     * 解析MDX文件
     */
    parseMDXFile(filePath: string, basePath: string): MDXFile;
    /**
     * 生成文档名称
     */
    generateDocumentName(mdxFile: MDXFile, chunkIndex?: number): string;
    /**
     * 分割MDX内容
     */
    splitContent(content: string): string[];
    /**
     * 将MDX文件转换为文档块
     */
    convertToDocumentChunks(mdxFile: MDXFile): DocumentChunk[];
    /**
     * 清理和格式化内容
     */
    cleanContent(content: string): string;
    /**
     * 处理MDX文件，返回准备上传的文档块
     */
    processMDXFile(filePath: string, basePath: string): DocumentChunk[];
}

declare class NextraDifyPlugin {
    private options;
    private difyClient;
    private mdxParser;
    constructor(options: DifyPluginOptions);
    /**
     * webpack插件应用方法
     */
    apply(compiler: Compiler): void;
    /**
     * 处理所有文档
     */
    processDocuments(context: string): Promise<void>;
    /**
     * 查找所有MDX文件
     */
    findMDXFiles(basePath: string): Promise<string[]>;
    /**
     * 处理单个文件
     */
    processFile(filePath: string, basePath: string): Promise<void>;
    /**
     * 上传文档块
     */
    uploadChunk(chunk: {
        name: string;
        content: string;
    }): Promise<void>;
    /**
     * 验证配置
     */
    static validateOptions(options: DifyPluginOptions): void;
}

export { DifyClient, MDXParser, NextraDifyPlugin };
export type { DifyApiResponse, DifyDocument, DifyPluginOptions, DocumentChunk, MDXFile, UploadResponse };
