package com.ruoyi.common.qiniu;

import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.ruoyi.common.utils.StringUtils;
import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.*;
import java.math.BigInteger;
import java.security.MessageDigest;

/**
 * 七牛云文件存储服务
 * @author Wzp
 */
@Component
public class QiNiuUploadUtils {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /** 磁盘图片配置 */
    @Resource
    private QiNiuConfig qiNiuConfig;

    /** 上传对象 */
    private UploadManager uploadManager;

    /** 上传凭证 */
    private Auth auth;

//    /**
//     * 初始化上传对象
//     */
//    protected void init(){
//        //构造一个带指定 Region 对象的配置类
//        Configuration cfg = new Configuration(Region.huanan());
//        // 指定分片上传版本
//        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;
//        this.uploadManager = new UploadManager(cfg);
//        // 获取token凭证对象
//        this.auth = Auth.create(qiNiuConfig.getAccessKey(), qiNiuConfig.getSecretKey());
//    }

    // /**
    //  * 上传字节数组
    //  * @param uploadBytes 字节数组数据
    //  * @return 结果
    //  */
    // public String  uploadByte(byte[] uploadBytes, String key){
    //     String fileUrl = "";
    //     File outputFile = new File(qiNiuConfig.getImgFolderUrl()+"/"+key);
    //     try (FileOutputStream fos = new FileOutputStream(outputFile)) {
    //         fos.write(uploadBytes);
    //     } catch (IOException e) {
    //         e.printStackTrace();
    //         logger.error(e.getMessage());
    //     }finally {
    //         fileUrl = qiNiuConfig.getLocalBaseUrl()+key;
    //         return fileUrl;
    //     }
    // }
    //
    // /**
    //  * 数据流上传
    //  * @param inputStream 数据流
    //  * @return 结果
    //  */
    // public String uploadInputStream(InputStream inputStream,String key) {
    //     String url = "";
    //
    //     File outputFile = new File(qiNiuConfig.getImgFolderUrl()+"/"+key);
    //
    //     try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
    //         byte[] buffer = new byte[4096];
    //         int bytesRead;
    //         while ((bytesRead = inputStream.read(buffer)) != -1) {
    //             outputStream.write(buffer, 0, bytesRead);
    //         }
    //     } catch (FileNotFoundException e) {
    //         logger.error(e.getMessage());
    //         throw new RuntimeException(e);
    //     } catch (IOException e) {
    //         logger.error(e.getMessage());
    //         throw new RuntimeException(e);
    //     }finally {
    //         url = qiNiuConfig.getLocalBaseUrl()+key;
    //         return url;
    //     }
    //
    // }
    //
    //
    //
    // /**
    //  * 获取文件上传名称
    //  * @param file 文件
    //  * @return 结果
    //  */
    // public String getFileUploadName(MultipartFile file){
    //     // 上传文件名
    //     String fileName = "";
    //     try {
    //         // 文件真实名称
    //         String originalFilename = file.getOriginalFilename();
    //         if (StringUtils.isNotBlank(originalFilename)){
    //             // 获取后缀名
    //             String substring = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
    //             // 获取文件hash值
    //             String s = md5HashCode(file.getInputStream());
    //             fileName = s+"."+substring;
    //         }
    //     } catch (IOException e) {
    //         e.printStackTrace();
    //     }
    //     return fileName;
    // }
    //
    // /**
    //  * java获取文件的md5值
    //  * @param fis 输入流
    //  * @return 结果
    //  */
    // public static String md5HashCode(InputStream fis) {
    //     try {
    //         //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
    //         MessageDigest md = MessageDigest.getInstance("MD5");
    //
    //         //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
    //         byte[] buffer = new byte[1024];
    //         int length = -1;
    //         while ((length = fis.read(buffer, 0, 1024)) != -1) {
    //             md.update(buffer, 0, length);
    //         }
    //         fis.close();
    //         //转换并返回包含16个元素字节数组,返回数值范围为-128到127
    //         byte[] md5Bytes  = md.digest();
    //         BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值
    //         return bigInt.toString(16);//转换为16进制
    //     } catch (Exception e) {
    //         e.printStackTrace();
    //         return "";
    //     }
    // }

    /**
     * 图片压缩
     * @param file 文件
     * @return 字节数组
     */
    public static byte[] getZipImage(MultipartFile file) {
        byte[] zipBytes = null;
        ByteArrayOutputStream outputStream = null;
        InputStream inputStream = null;
        try {
            byte[] bytes = file.getBytes();
            outputStream = new ByteArrayOutputStream(bytes.length);
            inputStream = file.getInputStream();
            Thumbnails.of(inputStream)
                    .scale(0.8f)
                    .outputQuality(1f)
                    .toOutputStream(outputStream);
            zipBytes = outputStream.toByteArray();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return zipBytes;
    }

}
