package com.gxwebsoft.ai.service;

import com.gxwebsoft.common.system.entity.User;
import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.ai.entity.AiCloudFile;
import com.gxwebsoft.ai.param.AiCloudFileParam;
import com.gxwebsoft.common.core.web.PageResult;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * AI云文件表Service
 *
 * @author yc
 */
public interface AiCloudFileService extends IService<AiCloudFile> {

    /**
     * 分页关联查询
     *
     * @param param 查询参数
     * @return PageResult<AiCloudFile>
     */
    PageResult<AiCloudFile> pageRel(AiCloudFileParam param);

    /**
     * 关联查询全部
     *
     * @param param 查询参数
     * @return List<AiCloudFile>
     */
    List<AiCloudFile> listRel(AiCloudFileParam param);

    /**
     * 根据id查询
     *
     * @param id ID
     * @return AiCloudFile
     */
    AiCloudFile getByIdRel(Integer id);

    /**
     * 异步处理文件上传
     *
     * @param client 阿里云客户端
     * @param workspaceId 工作空间ID
     * @param categoryId 分类ID
     * @param docId 文档ID
     * @param file 文件
     * @param loginUser 登录用户
     * @return CompletableFuture<String> 返回包含文件ID的Future
     */
    CompletableFuture<String> processFileAsync(String categoryId, Integer docId, MultipartFile file, User loginUser);

    /**
     * 删除文件（包括云存储和数据库记录）
     *
     * @param id 文件ID
     * @return 是否删除成功
     */
    boolean removeFileWithCloud(Integer id);

    /**
     * 批量删除文件（包括云存储和数据库记录）
     *
     * @param ids 文件ID列表
     * @return 是否删除成功
     */
    boolean removeFilesWithCloud(List<Integer> ids);

    /**
     * 获取文件扩展名
     *
     * @param filename 文件名
     * @return 文件扩展名
     */
    String getFileExtension(String filename);

    /**
     * 获取公司知识库ID
     *
     * @param docId 文档ID
     * @return 知识库ID
     */
    String getCompanyKbId(Integer docId);

    /**
     * 提交文档到知识库
     *
     * @param docId 文档ID
     * @param fileIds 文件ID列表
     */
    void submitDocuments(Integer docId, List<String> fileIds);

    /**
     * 删除文件（包括云存储、数据库记录和知识库索引）
     *
     * @param id 文件ID
     * @return 是否删除成功
     */
    boolean removeFileWithCloudAndIndex(Integer id);

    /**
     * 批量删除文件（包括云存储、数据库记录和知识库索引）
     *
     * @param ids 文件ID列表
     * @return 是否删除成功
     */
    boolean removeFilesWithCloudAndIndex(List<Integer> ids);
}