package com.ruoyi.common.utils;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.ruoyi.common.utils.uuid.UUID;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
public class QiniuUtils {

    // 设置好账号的ACCESS_KEY和SECRET_KEY
    @Value("${qiniu.oss.accessKey}")
    private String ACCESS_KEY;
    @Value("${qiniu.oss.secretKey}")
    private String SECRET_KEY;
    // 要上传的空间（创建空间的名称）
    @Value("${qiniu.oss.bucket}")
    private String bucketname;
    // 使用的是测试域名
    @Value("${qiniu.oss.url}")
    private String QINIU_IMAGE_DOMAIN;

    // 简单上传，使用默认策略，只需要设置上传的空间名就可以了
    private String getUpToken() {
        // 密钥配置
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        return auth.uploadToken(bucketname);
    }

    public String upload(MultipartFile file) throws IOException {
        try {
            int dotPos = file.getOriginalFilename().lastIndexOf(".");
            if (dotPos < 0) {
                return null;
            }
            String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();

            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
            // 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
            Configuration cfg = new Configuration(Zone.zone2());
            // ...其他参数参考类注释
            UploadManager uploadManager = new UploadManager(cfg);
            // 调用put方法上传
            Response res = uploadManager.put(file.getBytes(), fileName, this.getUpToken());
            // 打印返回的信息
            if (res.isOK() && res.isJson()) {
                // 返回这张存储照片的地址
                return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
            } else {
                return null;
            }
        } catch (QiniuException e) {
            // 请求失败时打印的异常的信息
            return null;
        }
    }

    public Map<String, String> uploadFile(MultipartFile file, String path) throws IOException {
        try {
            int dotPos = file.getOriginalFilename().lastIndexOf(".");
            if (dotPos < 0) {
                return new HashMap<>();
            }
            //上传文件的文件名
            String oldName = file.getOriginalFilename();

            //获取文件名后缀
            String fileExt = FileUploadUtils.getExtension(file).toLowerCase();

            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
            // 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
            Configuration cfg = new Configuration(Zone.autoZone());
            // ...其他参数参考类注释
            UploadManager uploadManager = new UploadManager(cfg);
            // 调用put方法上传
            Response res = uploadManager.put(file.getBytes(), (path.startsWith("/") ? path.substring(1) : path) + "/" + fileName, getUpToken());
            // 打印返回的信息
            if (res.isOK() && res.isJson()) {
                // 返回文件的存储信息
                String url = "" + JSONObject.parseObject(res.bodyString()).get("key");
                Map<String, String> map = new HashMap<>();
                map.put("oldName", oldName);
                map.put("url", QINIU_IMAGE_DOMAIN + url);
                map.put("fileName", fileName);
                return map;
            } else {
                return new HashMap<>();
            }
        } catch (QiniuException e) {
            e.printStackTrace();
            // 请求失败时打印的异常的信息
            return new HashMap<>();
        }
    }

    public boolean delete(String url) {
        try {
            // 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
            Configuration cfg = new Configuration(Zone.zone2());
            Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
            BucketManager bucketManager = new BucketManager(auth, cfg);

            // 获取七牛云中存储空间的名称
            int slashIndex = url.indexOf("/", 1);
            String bucket = url.substring(1, slashIndex);

            // 获取文件的key（路径）
            String key = url.substring(slashIndex + 1);

            // 删除文件
            bucketManager.delete(bucket, key);

            return true;
        } catch (QiniuException e) {
            e.printStackTrace();
            return false;
        }
    }

}

