package com.yfd.platform.modules.experimentalData.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.modules.experimentalData.domain.*;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yfd.platform.modules.storage.model.result.FileItemResult;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * <p>
 * 试验任务文档表 服务类
 * </p>
 *
 * @author LiMengNan
 * @since 2025-01-21
 */
public interface ITsFilesService extends IService<TsFiles> {

    /**********************************
     * 用途说明: 分页查询试验数据管理-文档内容
     * 参数说明
     * id            id
     * fileName      文件名称
     * startDate     (开始日期)
     * endDate      （结束日期）
     * keywords      关键字
     *nodeId         节点ID
     *taskId          任务ID
     * pageNum 当前页
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果
     ***********************************/
    Page<TsFiles> getTsFilesPage(String id, String fileName, String startDate, String endDate, String keywords, String nodeId, String taskId, String fileName1, String childNode, Page<TsFiles> page) throws Exception;

    /***********************************
     * 用途说明：新增试验数据管理-文档内容
     * 参数说明
     * TsFiles     文档内容
     * 返回值说明:  com.yfd.platform.config.ResponseResult 返回新增成功或者失败
     ***********************************/
    ResponseResult addTsFiles(TsFiles tsFiles);

    /**********************************
     * 用途说明: 修改试验数据管理-文档内容
     * 参数说明
     * TsFiles     文档内容
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回修改成功或者失败
     ***********************************/
    ResponseResult updateTsFiles(TsFiles tsFiles);

    /**********************************
     * 用途说明: 批量删除试验数据管理-文档内容
     * 参数说明  id 文档内容ID
     * 参数说明  type local还是minio
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回批量删除成功或失败
     ***********************************/
    String deleteTsFilesByIds(List<String> dataset, String type);

    /**********************************
     * 用途说明: 压缩文件夹接口
     * 参数说明  ids 文件id数组
     * 参数说明  compressedFormat 压缩文件格式
     * 参数说明  compressedName 压缩文件名称
     * 参数说明  compressedPath 压缩文件路径
     * 参数说明  covered 是否覆盖 0 覆盖更新updateTime时间 1提示文件存在
     * 参数说明  parentId 父ID
     * 参数说明  path   根目录 /项目名/节点名称/
     * 返回值说明: com.yfd.platform.config.ResponseResult
     ***********************************/
    String compressFolder(String ids, String compressedFormat, String compressedName, String compressedPath, String covered, String parentId,String path) throws FileNotFoundException;

    /**********************************
     * 用途说明: 解压缩接口
     * 参数说明  id  要解压的文件id
     * 参数说明  decompressionPath 解压缩路径
     * 参数说明  parentId 父ID
     * 参数说明  path   根目录 /项目名/节点名称/
     * 返回值说明: com.yfd.platform.config.ResponseResult
     ***********************************/
    String decompressionFolder(String id, String decompressionPath, String parentId,  String path);

    /**********************************
     * 用途说明: 将文件上传到备份空间
     * 参数说明  parameter 数据集合
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
     ***********************************/
    Boolean uploadToBackup(Parameter parameter);

    /**********************************
     * 用途说明: 从备份空间下载到工作空间
     * 参数说明  parameter 数据集合
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
     ***********************************/
    Boolean downloadToLocal(Parameter parameter);

    /***********************************
     * 用途说明：新增试验数据管理-文件夹
     * 参数说明
     * TsFiles     文档内容
     * 返回值说明:  com.yfd.platform.config.ResponseResult 返回新增成功或者失败
     ***********************************/
    ResponseResult addTsFile(TsFiles tsFiles) throws IOException;

    /**********************************
     * 用途说明:   查询实验数据管理文件夹
     * 参数说明
     * pageNum 当前页
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果
     ***********************************/
    List<TsFiles> getsListTsFiles(String id, String path, String nodeId, String taskId);

    /**
     * 移动文件或文件夹
     * 参数说明 newPath 新路径
     * 参数说明 oldpaths 原路径
     * 参数说明 ParentId 父ID
     * 参数说明 newFileName 父ID
     * 参数说明 Rename 重命名的文件名称
     * 参数说明 type 覆盖还是重命名  0 1
     */
    String moveFileFolder(MoveCopyFileFolderRequest request) throws IOException;

    /**
     * 复制文件或文件夹
     * 参数说明 newPath 新路径
     * 参数说明 oldpaths 原路径
     * 参数说明 ParentId 父ID
     * 参数说明 newFileName 父ID
     * 参数说明 Rename 重命名的文件名称
     * 参数说明 type 覆盖还是重命名  0 1
     */
    String copyFileFolder(MoveCopyFileFolderRequest request) throws IOException;

    /**********************************
     * 用途说明: 实时获取轨迹数据
     * 参数说明  id 文件的ID
     * 参数说明  samTimes 时间
     * 参数说明  token SSE连接的token
     * 返回值说明: com.yfd.platform.config.ResponseResult
     ***********************************/
    void batchSendNaviOutDataJob(String id, int samTimes, String token);

    /**
     * 查询文件内容接口
     *
     * @param id 文件的id
     * @return 文件内容的纯文本（UTF-8 编码）
     */
    String readFileContent(String id) throws IOException;

    /**********************************
     * 用途说明: 保存文件内容接口
     * 参数说明  id 文件的ID
     * 参数说明  content 新的文件内容（HTML/文本）
     * 返回值说明: com.yfd.platform.config.ResponseResult操作结果
     ***********************************/
    void saveFileContent(String id, String content) throws IOException;

    /**********************************
     * 用途说明: 批量修改文件中多行多列的内容
     * 参数说明  request 要修改的文件信息
     * 返回值说明: com.yfd.platform.config.ResponseResult操作结果
     ***********************************/
    void batchUpdateFile(String id, List<ModifyCommand> modifications) throws IOException;

    /**********************************
     * 用途说明: 文件自动备份
     * 参数说明  taskId 节点ID
     * 参数说明  nodeId 任务ID
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
     ***********************************/
    String automaticFileBackup(String taskId, String nodeId);

    /**********************************
     * 用途说明: 查询本地结构树
     * 参数说明  taskId 节点ID
     * 参数说明  nodeId 任务ID
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回双树数据
     ***********************************/
    DualTreeResponse listLocalTree(String taskId, String nodeId);

    /**********************************
     * 用途说明: 查询备份空间结构树
     * 参数说明  taskId 节点ID
     * 参数说明  nodeId 任务ID
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回双树数据
     ***********************************/
    DualTreeResponse listBackupTree(String taskId, String nodeId);

    /**********************************
     * 用途说明: 获取文件url
     * 参数说明  id     文件夹ID
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回文件信息
     ***********************************/
    FileItemResult obtainUrl(String id, String type);

    /**********************************
     * 用途说明: 对比本地有minio没有的文件差异
     * 参数说明  taskId 节点ID
     * 参数说明  nodeId 任务ID
     * 参数说明  id     文件id
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
     ***********************************/
    Page<TsFiles> compareLocal(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page);

    /**********************************
     * 用途说明: 对比本地没有minio有的文件差异
     * 参数说明  taskId 节点ID
     * 参数说明  nodeId 任务ID
     * 参数说明  id     文件id
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
     ***********************************/
    Page<TsFiles> compareMinio(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page);



    /**********************************
     * 用途说明: 对比本地和minio的文件差异
     * 参数说明  taskId 节点ID
     * 参数说明  nodeId 任务ID
     * 参数说明  id     文件id
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
     ***********************************/
    Page<TsFiles> compareMd5(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page);


    void automaticFileBackupAsync(String taskId, String nodeId) throws IOException;

    Boolean deleteTsFilesByNodeId(String nodeId, String taskId);

    /**********************************
     * 用途说明: 停止获取轨迹数据
     * 参数说明  token SSE连接的token
     * 返回值说明: com.yfd.platform.config.ResponseResult
     ***********************************/
    void stopSimpleNavi(String token);

    List<TsFiles> compareLocalList(List<String> dataset, String nodeId, String taskId);

    Object compareMinioList(List<String> dataset, String nodeId, String taskId);

    Object compareMd5List(List<String> dataset, String nodeId, String taskId);

    void automaticFileBackupAsyncByIds(List<String> dataset,String taskId,  String nodeId) throws IOException;

    IPage<TsFiles> getCachedTsFilesPage(String taskId, String nodeId, int currentPage,String id);
}
