package com.microservices.file.mapper;

import com.microservices.file.domain.FileUploadSession;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 文件分片上传会话Mapper接口
 *
 * @author microservices
 */
@Mapper
public interface FileUploadSessionMapper {

    /**
     * 查询文件分片上传会话
     *
     * @param uploadId 上传ID
     * @return 文件分片上传会话
     */
    FileUploadSession selectByUploadId(String uploadId);

    /**
     * 查询文件分片上传会话列表
     *
     * @param fileUploadSession 文件分片上传会话
     * @return 文件分片上传会话集合
     */
    List<FileUploadSession> selectSessionList(FileUploadSession fileUploadSession);

    /**
     * 新增文件分片上传会话
     *
     * @param fileUploadSession 文件分片上传会话
     * @return 结果
     */
    int insertSession(FileUploadSession fileUploadSession);

    /**
     * 修改文件分片上传会话
     *
     * @param fileUploadSession 文件分片上传会话
     * @return 结果
     */
    int updateSession(FileUploadSession fileUploadSession);

    /**
     * 删除文件分片上传会话
     *
     * @param uploadId 上传ID
     * @return 结果
     */
    int deleteByUploadId(String uploadId);

    /**
     * 批量删除文件分片上传会话
     *
     * @param uploadIds 需要删除的上传ID集合
     * @return 结果
     */
    int deleteByUploadIds(String[] uploadIds);

    /**
     * 查询过期的会话
     *
     * @return 过期的会话列表
     */
    List<FileUploadSession> selectExpiredSessions();

    /**
     * 根据文件签名查询已完成的会话
     *
     * @param fileSignature 文件签名（可能是完整MD5或采样点哈希）
     * @return 文件分片上传会话
     */
    FileUploadSession selectCompletedByFileSignature(String fileSignature);

    /**
     * 根据文件哈希和哈希类型查询已完成的会话
     *
     * @param fileSignature 文件哈希
     * @param hashType 哈希类型
     * @return 文件分片上传会话
     */
    FileUploadSession selectCompletedByFileSignatureAndType(@Param("fileSignature") String fileSignature, @Param("hashType") String hashType);

    /**
     * 更新会话状态
     *
     * @param uploadId 上传ID
     * @param status   状态
     * @return 结果
     */
    int updateStatus(@Param("uploadId") String uploadId, @Param("status") String status);

    /**
     * 增加已上传分片数
     *
     * @param uploadId 上传ID
     * @return 结果
     */
    int incrementUploadedChunks(String uploadId);

    FileUploadSession selectUploadingOrMergingByFileSignatureAndType(@Param("fileSignature") String fileSignature, @Param("hashType") String hashType);
}
