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.KnowledgeVector;
import org.dromara.knowledge.domain.bo.KnowledgeVectorBo;
import org.dromara.knowledge.domain.vo.KnowledgeSearchResultVo;
import org.dromara.knowledge.domain.vo.KnowledgeVectorVo;

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

/**
 * 知识片段向量Service接口
 *
 * @author pengles
 */
public interface KnowledgeVectorService extends IService<KnowledgeVector> {

    /**
     * 查询知识片段向量
     */
    KnowledgeVectorVo queryById(Long id);

    /**
     * 查询知识片段向量列表
     */
    TableDataInfo<KnowledgeVectorVo> queryPageList(KnowledgeVectorBo bo, PageQuery pageQuery);

    /**
     * 查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryList(KnowledgeVectorBo bo);

    /**
     * 新增知识片段向量
     */
    Boolean insertByBo(KnowledgeVectorBo bo);

    /**
     * 修改知识片段向量
     */
    Boolean updateByBo(KnowledgeVectorBo bo);

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

    /**
     * 根据向量ID查询知识片段向量
     */
    KnowledgeVectorVo queryByVectorId(String vectorId);

    /**
     * 根据知识库ID查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryByKnowledgeId(String knowledgeId);

    /**
     * 根据文档ID查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryByDocId(String docId);

    /**
     * 根据知识片段ID查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryByFragmentId(String fragmentId);

    /**
     * 根据模型名称查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryByModelName(String modelName);

    /**
     * 根据状态查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryByStatus(Integer status);

    /**
     * 批量更新知识片段向量状态
     */
    Boolean updateStatusByIds(Collection<Long> ids, Integer status);

    /**
     * 根据知识库ID和状态查询知识片段向量列表
     */
    List<KnowledgeVectorVo> queryByKnowledgeIdAndStatus(String knowledgeId, Integer status);

    /**
     * 为知识片段生成向量
     *
     * @param knowledgeId 知识库ID
     * @param docId       文档ID
     * @param fragmentId  片段ID
     * @param content     片段内容
     * @param modelName   向量模型名称
     * @return 向量ID
     */
    String generateVector(String knowledgeId, String docId, String fragmentId, String content, String modelName);

    /**
     * 批量为知识片段生成向量
     *
     * @param knowledgeId      知识库ID
     * @param docId            文档ID
     * @param fragmentContents 片段内容映射 (fragmentId -> content)
     * @param modelName        向量模型名称
     * @return 成功生成向量的片段ID列表
     */
    List<String> batchGenerateVectors(String knowledgeId, String docId,
                                      Map<String, String> fragmentContents, String modelName);

    /**
     * 向量相似度搜索
     *
     * @param knowledgeId 知识库ID
     * @param queryText   查询文本
     * @param modelName   向量模型名称
     * @param topK        返回结果数量
     * @param threshold   相似度阈值
     * @return 搜索结果列表
     */
    List<KnowledgeSearchResultVo> vectorSimilaritySearch(String knowledgeId, String queryText,
                                                         String modelName, Integer topK, Double threshold);

    /**
     * 文本转向量
     *
     * @param text      文本内容
     * @param modelName 模型名称
     * @return 向量数据
     */
    double[] textToVector(String text, String modelName);

    /**
     * 计算向量相似度
     *
     * @param vector1 向量1
     * @param vector2 向量2
     * @return 相似度分数 (0-1)
     */
    double calculateSimilarity(double[] vector1, double[] vector2);

    /**
     * 删除知识库相关的所有向量
     *
     * @param knowledgeId 知识库ID
     * @return 删除的向量数量
     */
    int deleteVectorsByKnowledgeId(String knowledgeId);

    /**
     * 删除文档相关的所有向量
     *
     * @param docId 文档ID
     * @return 删除的向量数量
     */
    int deleteVectorsByDocId(String docId);

    /**
     * 获取知识库向量统计信息
     *
     * @param knowledgeId 知识库ID
     * @return 统计信息映射
     */
    Map<String, Object> getVectorStatistics(String knowledgeId);

    /**
     * 检查向量模型是否可用
     *
     * @param modelName 模型名称
     * @return 是否可用
     */
    boolean isModelAvailable(String modelName);

    /**
     * 获取可用的向量模型列表
     *
     * @return 模型名称列表
     */
    List<String> getAvailableModels();

}