package com.persagy.dmp.file.service;

import lombok.SneakyThrows;

import javax.servlet.http.HttpServletResponse;
import javax.swing.filechooser.FileView;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 文件存储服务接口
 * @author Charlie Yu
 */
public interface IFileStorageService {

    /**
     * 文件上传
     * @param bucketName 桶名
     * @param fileName 文件名 - 同名文件则覆盖
     * @param input 输入流
     */
    void upload(String bucketName, String fileName, InputStream input);

    /**
     * 文件下载
     * @param bucketName 桶名
     * @param fileName 文件名
     */
    InputStream download(String bucketName, String fileName);

    /**
     * 获取下载Url
     * @param bucketName 桶名
     * @param fileName 文件名
     */
    String fetchUrl(String bucketName, String fileName);

    /**
     * 获取下载Url
     * @param bucketName 桶名
     * @param fileName 文件名
     */
    String fetchUrl(String bucketName, String fileName,Map<String,String> extraQueryParamsMap);

    /**
     * 文件是否存在
     * @param bucketName 桶名
     * @param fileName 文件名
     */
    boolean exists(String bucketName, String fileName);

    /**
     * 删除文件
     * @param bucketName 桶名
     * @param fileName 文件名
     */
    void delete(String bucketName, String fileName);

    /**
     * 删除桶
     * @param bucketName 桶名
     */
    void deletePath(String bucketName);

    /***
     * Description: 存储桶是否存在
     * @param bucketName: 存储桶名称
     * @return true/false
     * @author : lijie
     * Update By lijie 2021/10/16 14:35
     */
    boolean isBucketExist(String bucketName);

    /***
     * Description:  创建存储桶
     * @param bucketName : 存储桶名称
     * @return : true/false
     * @author : lijie
     * Update By lijie 2021/10/16 14:35
     */
    boolean createBucket(String bucketName);

    /***
     * Description: 获取访问对象的外链地址
     * @param bucketName : 存储桶名称
     * @param objectName : 对象名称
     * @param expiry : 过期时间(分钟) 最大为7天 超过7天则默认最大值
     * @return : viewUrl
     * @author : lijie
     * Update By lijie 2021/10/16 14:41
     */
    String getObjectUrl(String bucketName, String objectName, Integer expiry);

    /***
     * Description: 创建上传文件对象的外链
     * @param bucketName : 存储桶名称
     * @param objectName : 欲上传文件对象的名称
     * @param expiry : 过期时间(分钟) 最大为7天 超过7天则默认最大值
     * @return : uploadUrl
     * @author : lijie
     * Update By lijie 2021/10/16 14:41
     */
    String createUploadUrl(String bucketName, String objectName, Integer expiry);

    /***
     * Description: 创建上传文件对象的外链
     * @param bucketName : 存储桶名称
     * @param objectName : 欲上传文件对象的名称
     * @return : java.lang.String
     * @author : lijie
     * Update By lijie 2021/10/16 14:42
     */
    String createUploadUrl(String bucketName, String objectName);
    /***
     * Description: 批量创建分片上传外链
     * @param bucketName : 存储桶名称
     * @param objectMd5 : 欲上传分片文件主文件的MD5
     * @param chunkCount : 分片数量
     * @return : uploadChunkUrls
     * @author : lijie
     * Update By lijie 2021/10/16 14:43
     */
    List<String> createUploadChunkUrlList(String bucketName, String objectMd5, Integer chunkCount);

    /***
     * Description: 创建指定序号的分片文件上传外链
     * @param bucketName : 存储桶名称
     * @param objectMd5 : 欲上传分片文件主文件的MD5
     * @param partNumber : 分片序号
     * @return : uploadChunkUrl
     * @author : lijie
     * Update By lijie 2021/10/16 14:44
     */
    String createUploadChunkUrl(String bucketName, String objectMd5, Integer partNumber);

    /***
     * Description: 获取对象文件名称列表
     * @param bucketName : 存储桶名称
     * @param prefix : 对象名称前缀
     * @param sort : 是否排序(升序)
     * @return : objectNames
     * @author : lijie
     * Update By lijie 2021/10/16 14:45
     */
    List<String> listObjectNames(String bucketName, String prefix, Boolean sort);

    /***
     * Description: 获取对象文件名称列表
     * @param bucketName : 存储桶名称
     * @param prefix : 对象名称前缀
     * @return : objectNames
     * @author : lijie
     * Update By lijie 2021/10/16 14:47
     */
    List<String> listObjectNames(String bucketName, String prefix);

    /***
     * Description: 获取分片文件名称列表
     * @param bucketName : 存储桶名称
     * @param objectMd5 : 对象Md5
     * @return : objectChunkNames
     * @author : lijie
     * Update By lijie 2021/10/16 14:48
     */
    List<String> listChunkObjectNames(String bucketName, String objectMd5);

    /***
     * Description: 获取分片名称地址HashMap key=分片序号 value=分片文件地址
     * @param bucketName : 存储桶名称
     * @param objectMd5 : 对象Md5
     * @return : objectChunkNameMap
     * @author : lijie
     * Update By lijie 2021/10/16 14:49
     */
    Map<Integer, String> mapChunkObjectNames(String bucketName, String objectMd5);

    /***
     * Description: 合并分片文件成对象文件
     * @param chunkBucKetName : 分片文件所在存储桶名称
     * @param composeBucketName : 合并后的对象文件存储的存储桶名称
     * @param chunkNames : 分片文件名称集合
     * @param objectName : 合并后的对象文件名称
     * @return : boolean
     * @author : lijie
     * Update By lijie 2021/10/16 14:50
     */
    boolean composeObject(String chunkBucKetName, String composeBucketName, List<String> chunkNames, String objectName);

    /***
     * Description: 合并分片文件成对象文件
     * @param bucketName : 存储桶名称
     * @param chunkNames : 分片文件名称集合
     * @param objectName : 合并后的对象文件名称
     * @return : true/false
     * @author : lijie
     * Update By lijie 2021/10/16 14:51
     */
    boolean composeObject(String bucketName, List<String> chunkNames, String objectName);
    /***
     * Description: 获取chuck的bucketName
     * @param bucketName : 传入的bucketName
     * @return : java.lang.String
     * @author : lijie
     * Update By lijie 2021/10/21 10:39
     */
    String getChuckBucketName(String bucketName);

    @SneakyThrows
    Long getObjectSize(String bucketName, String objectName);
    /***
     * Description: 批量删除
     * @param deleteFileMap : {bucketName:[fileName1,fileName2...]}
     * @author : lijie
     * Update By lijie 2021/12/9 14:33
     */
    void batchDelete(Map<String, Set<String>> deleteFileMap);
    /***
     * Description: 上传分片
     * @param chuckBucketName : bucketName
     * @param fileMd5 : 文件的md5值
     * @param inputStream : 文件流
     * @param totalChunks : 总分片数
     * @param currentChuckNumber : 当前分片数
     * return : void
     * @author : lijie
     * Update By 2021/12/17 15:18
     */
    void uploadChuck(String chuckBucketName, String fileMd5, InputStream inputStream,Integer totalChunks,
                     Integer currentChuckNumber);
    /**
     * 文件下载
     * @param bucketName 桶名
     * @param fileName 文件名
     * @param response 响应对象
     */
    InputStream download(String bucketName, String fileName, HttpServletResponse response,String realFileName);
}
