package org.springblade.file.service;

import org.springblade.file.pojo.vo.PartEtagVO;

import java.io.File;
import java.io.InputStream;
import java.util.List;

/**
 *  文件接口
 * @author bfhuange
 * @date 2024/10/21
 */
public interface IFileService {

    /**
     *  上传文件
     * @param objectKey 文件key
     * @param is 输入流
     */
    void uploadFile(String objectKey, InputStream is);

    /**
     *  上传临时文件
     * @param objectKey 文件key
     * @param is 输入流
     * @param expires 过期时间，单位天，过期后自动删除
     */
    String uploadTempFile(String objectKey, InputStream is, Integer expires);

    /**
     *  上传文件
     * @param objectKey 文件key
     * @param file 文件
     */
    void uploadFile(String objectKey, File file);

    /**
     * 初始化分片上传
     *
     * @param objectKey 文件key
     * @return 上传任务id
     */
    String initiateMultipartUpload(String objectKey);

    /**
     *  分段上传
     * @param objectKey 文件key
     * @param uploadId 上传任务id
     * @param file 文件
     * @param partNumber 分段编号
     * @param offset 偏移位
     * @param partSize 分段大小
     * @return
     */
    PartEtagVO uploadPart(String objectKey, String uploadId, File file, int partNumber, Long offset, Long partSize);

    /**
     *  完成分段上传任务
     * @param objectKey 文件key
     * @param uploadId 上传任务id
     * @param partEtagVOS 要合并的分段
     */
    void completeMultipartUpload(String objectKey, String uploadId, List<PartEtagVO> partEtagVOS);

    /**
     *  取消分段上传任务
     * @param objectKey
     * @param uploadId
     */
    void cancelMultipartUpload(String objectKey, String uploadId);

    /**
     *  获取文件链接
     * @param objectKey 文件key
     * @param expires 过期时间，单位秒
     * @return
     */
    String getFileUrl(String objectKey, Long expires);

    /**
     *  获取文件链接
     * @param objectKey 文件key
     * @param fileName 文件名
     * @param expires 过期时间，单位秒
     * @return
     */
    String getFileUrl(String objectKey, String fileName, Long expires);

    /**
     * 获取文件上传链接
     *
     * @param objectKey  文件key
     * @param uploadId
     * @param partNumber
     * @param expires    过期时间，单位秒
     * @return
     */
    String getUploadPartUrl(String objectKey, String uploadId, Integer partNumber, Long expires);

    /**
     *  获取文件链接批量
     * @param objectKeys
     * @param expires 过期时间
     * @return
     */
    List<String> getFileUrls(List<String> objectKeys, Long expires);

    /**
     * 下载文件
     * @param objectKey
     * @param downloadFile 下载路径
     */
    void downloadFile(String objectKey, String downloadFile);

    /**
     *  获取文件md5
     * @param file
     * @return
     */
    String getFileMd5(File file);
}
