package org.dromara.knowledge.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.knowledge.domain.KnowledgeInfo;
import org.dromara.knowledge.domain.bo.KnowledgeInfoBo;
import org.dromara.knowledge.domain.vo.KnowledgeInfoVo;
import org.dromara.knowledge.domain.vo.KnowledgeSearchResultVo;
import org.dromara.knowledge.domain.vo.KnowledgeStatusVo;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collection;
import java.util.List;

/**
 * 知识库信息Service接口
 *
 * @author pengles
 */
public interface KnowledgeInfoService extends IService<KnowledgeInfo> {

    /**
     * 查询知识库信息
     */
    KnowledgeInfoVo queryById(Long id);

    /**
     * 查询知识库信息列表
     */
    TableDataInfo<KnowledgeInfoVo> queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery);

    /**
     * 查询知识库信息列表
     */
    List<KnowledgeInfoVo> queryList(KnowledgeInfoBo bo);

    /**
     * 新增知识库信息
     */
    Boolean insertByBo(KnowledgeInfoBo bo);

    /**
     * 修改知识库信息
     */
    Boolean updateByBo(KnowledgeInfoBo bo);

    /**
     * 校验并批量删除知识库信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 根据用户ID查询知识库列表
     */
    List<KnowledgeInfoVo> queryListByUserId(Long userId);

    /**
     * 根据知识库ID查询知识库信息
     */
    KnowledgeInfoVo queryByKnowledgeId(Long knowledgeId);

    /**
     * 上传文档到知识库
     *
     * @param knowledgeId 知识库ID
     * @param file        上传的文件
     * @return 文档ID
     */
    String uploadDocument(String knowledgeId, MultipartFile file);

    /**
     * 批量上传文档到知识库
     *
     * @param knowledgeId 知识库ID
     * @param files       上传的文件列表
     * @return 文档ID列表
     */
    List<String> batchUploadDocuments(String knowledgeId, MultipartFile[] files);

    /**
     * 检索知识库
     *
     * @param knowledgeId 知识库ID
     * @param query       查询文本
     * @param limit       返回结果数量限制
     * @return 检索结果列表
     */
    List<KnowledgeSearchResultVo> searchKnowledge(String knowledgeId, String query, Integer limit);

    /**
     * 获取知识库处理状态
     *
     * @param knowledgeId 知识库ID
     * @return 知识库状态信息
     */
    KnowledgeStatusVo getKnowledgeStatus(String knowledgeId);

    /**
     * 处理文档并生成知识片段
     *
     * @param knowledgeId 知识库ID
     * @param docId       文档ID
     * @param content     文档内容
     * @return 处理任务ID
     */
    String processDocument(String knowledgeId, String docId, String content);

    /**
     * 对知识片段进行向量化
     *
     * @param knowledgeId 知识库ID
     * @param fragmentId  知识片段ID
     * @return 向量化任务ID
     */
    String vectorizeFragment(String knowledgeId, String fragmentId);
}