package org.xyzh.api.ai.file;

import org.springframework.web.multipart.MultipartFile;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.ai.TbAiUploadFile;

import java.util.List;
import java.util.Map;

/**
 * @description AI文件上传服务接口
 * @filename AiUploadFileService.java
 * @author AI Assistant
 * @copyright xyzh
 * @since 2025-11-04
 */
public interface AiUploadFileService {

    /**
     * 上传文件用于对话（图文多模态）
     * @param file 上传的文件
     * @param agentId 智能体ID
     * @return Dify文件信息（包含id、name、size等）
     */
    ResultDomain<Map<String, Object>> uploadFileForChat(
            MultipartFile file,
            String agentId
    );

    /**
     * 上传文件到知识库（同步到Dify）
     * @param knowledgeId 知识库ID
     * @param file 上传的文件
     * @param indexingTechnique 索引方式（可选）
     * @return 上传结果
     */
    ResultDomain<TbAiUploadFile> uploadToKnowledge(
            String knowledgeId,
            MultipartFile file,
            String indexingTechnique
    );

    /**
     * 批量上传文件到知识库
     * @param knowledgeId 知识库ID
     * @param files 上传的文件列表
     * @param indexingTechnique 索引方式（可选）
     * @return 上传结果列表
     */
    ResultDomain<TbAiUploadFile> batchUploadToKnowledge(
            String knowledgeId,
            List<MultipartFile> files,
            String indexingTechnique
    );

    /**
     * 删除文件（同时删除Dify中的文档）
     * @param fileId 文件ID
     * @return 删除结果
     */
    ResultDomain<Boolean> deleteFile(String fileId);

    /**
     * 查询文件处理状态（从Dify同步）
     * @param fileId 文件ID
     * @return 文件信息（包含最新状态）
     */
    ResultDomain<TbAiUploadFile> getFileStatus(String fileId);

    /**
     * 根据ID查询文件信息
     * @param fileId 文件ID
     * @return 文件信息
     */
    ResultDomain<TbAiUploadFile> getFileById(String fileId);

    /**
     * 查询知识库的文件列表
     * @param knowledgeId 知识库ID
     * @return 文件列表
     */
    ResultDomain<TbAiUploadFile> listFilesByKnowledge(String knowledgeId);

    /**
     * 分页查询文件列表
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return 分页结果
     */
    PageDomain<TbAiUploadFile> pageFiles(TbAiUploadFile filter, PageParam pageParam);

    /**
     * 同步文件状态（从Dify同步向量化状态）
     * @param fileId 文件ID
     * @return 同步结果
     */
    ResultDomain<TbAiUploadFile> syncFileStatus(String fileId);

    /**
     * 批量同步知识库的所有文件状态
     * @param knowledgeId 知识库ID
     * @return 同步结果
     */
    ResultDomain<TbAiUploadFile> syncKnowledgeFiles(String knowledgeId);
    
    /**
     * 查询消息关联的文件列表
     * @param messageId 消息ID
     * @return 文件列表
     */
    ResultDomain<TbAiUploadFile> listFilesByMessageId(String messageId);
}
