package com.philisense.www.cloud;

import cn.hutool.http.HttpUtil;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * @description: Oss基础客户端
 **/
public abstract class OssStorageService {

    /**
     * oss配置
     */
    public OssStorageConfig config;


    /**
     * 文件上传
     *
     * @param inputStream 文件 上传路径
     * @param path
     * @return
     */
    public abstract String upload(InputStream inputStream, String path);


    /**
     * 文件上传
     *
     * @param data 文件 上传路径
     * @param path
     * @return
     */
    public abstract String upload(byte[] data, String path);


    /**
     * 下载文件
     *
     * @param url 文件地址
     * @return
     */
    public InputStream download(String url) {
        final ByteArrayOutputStream output = new ByteArrayOutputStream();
        HttpUtil.download(url, output, false);
        return new ByteArrayInputStream(output.toByteArray());
    }

    /**
     * 删除文件
     *
     * @param path 相对于存储系统的路径
     * @return
     */
    public abstract void delete(String path);

    /**
     * 生成下载的url
     * @param path 相对于存储系统的路径
     * @return
     */
    public abstract String getFileUrl(String path);

    /**
     * 大文件上传检查文件
     * @param path 相对于存储系统的路径
     * @param name 文件名
     * @param hash 文件HASH
     * @param fileSize 文件大小
     * @param total 文件分割总数量
     * @return
     */
    public abstract Map<String, Object> chunksCheck(String path, String name, String hash, Integer fileSize, Integer total);

    /**
     * 上传切片
     * @param file   文件
     * @param path   相对于存储系统的路径
     * @param hash  文件HASH
     * @param uploadId   上传Id
     * @param index  下标
     * @param fileSize  文件大小
     * @return
     * @throws IOException
     */
    public abstract Map<String, Object> chunksUpload(MultipartFile file, String path, String hash, String uploadId, Integer index, String fileSize);

    /**
     * 合并切片
     * @param path  相对于存储系统的路径
     * @param name  文件名
     * @param hash  文件HASH
     * @param uploadId   上传Id
     * @param fileSize   文件大小
     * @return
     */
    public abstract String chunksMerge(String path, String name, String hash, String uploadId, String fileSize);
}
