package com.microservices.file.service;

import com.microservices.file.domain.FileUploadSession;
import com.microservices.file.domain.vo.CheckChunkVo;
import com.microservices.file.domain.vo.CheckInstantUploadVo;
import com.microservices.file.domain.vo.InitChunkedUploadVo;
import com.microservices.file.domain.vo.UploadProgressVo;
import com.microservices.file.domain.vo.input.InitChunkedUploadInputVo;
import com.microservices.system.api.domain.SysFileInfo;
import org.springframework.web.multipart.MultipartFile;

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

/**
 * 分片上传服务接口
 *
 * @author microservices
 */
public interface IChunkedUploadService {

    /**
     * 初始化分片上传
     * <p>
     * 功能：
     * 1. 创建上传会话
     * 2. 根据文件大小判断哈希类型（FULL/SAMPLE）
     * 3. 返回采样点信息（SAMPLE类型）
     *
     * @param input 初始化分片输入对象
     * @return 初始化结果，包含 uploadId、totalChunks、chunkSize、hashType、sampleChunks
     */
    InitChunkedUploadVo initChunkedUpload(InitChunkedUploadInputVo input);

    /**
     * 检查秒传（简化版）
     * <p>
     * 功能：
     * 1. 校验上传会话和时间窗口
     * 2. 查询是否存在相同的 file_hash 且状态为已完成
     * 3. 秒传成功：删除当前会话，返回已存在文件信息
     * 4. 不能秒传：存储 fileHash，返回继续上传
     *
     * @param uploadId 上传ID
     * @param fileHash 文件哈希（完整文件MD5或采样点哈希）
     * @return 检查结果
     */
    CheckInstantUploadVo checkInstantUpload(String uploadId, String fileHash);

    /**
     * 检查分片是否已上传（断点续传）
     *
     * @param uploadId    上传ID
     * @param chunkNumber 分片序号
     * @return 分片检查结果
     */
    CheckChunkVo checkChunk(String uploadId, Integer chunkNumber);

    /**
     * 上传分片
     *
     * @param uploadId    上传ID
     * @param chunkNumber 分片序号
     * @param chunk       分片文件
     * @return 上传结果
     */
    Map<String, Object> uploadChunk(String uploadId, Integer chunkNumber, MultipartFile chunk);

    /**
     * 合并分片
     * <p>
     * 功能：
     * 1. 合并所有分片为完整文件
     * 2. 根据哈希类型校验文件完整性（FULL-完整MD5，SAMPLE-采样点哈希）
     * 3. 调用现有文件服务保存文件
     * 4. 清理临时分片文件
     *
     * @param uploadId 上传ID
     * @return 合并后的文件信息
     */
    SysFileInfo mergeChunks(String uploadId);

    /**
     * 取消上传
     * <p>
     * 功能：
     * 1. 删除上传会话记录
     * 2. 清理已上传的分片文件
     *
     * @param uploadId 上传ID
     * @return 取消结果
     */
    boolean cancelUpload(String uploadId);

    /**
     * 获取上传进度
     *
     * @param uploadId 上传ID
     * @return 上传进度
     */
    UploadProgressVo getProgress(String uploadId);

    /**
     * 清理过期的上传会话
     * <p>
     * 定时任务调用，清理：
     * 1. 过期未完成的会话
     * 2. 对应的临时分片文件
     *
     * @return 清理的会话数量
     */
    int cleanExpiredSessions();
    void cleanupTempFiles(FileUploadSession session);
    List<Integer> parseSampleChunks(String sampleChunksStr);
    String calculateSampleHashFromChunks(String tempPath, List<Integer> sampleChunks);
    String mergeChunkFiles(String baseFilePath,FileUploadSession session);
}
