
package com.artfess.file.util;

import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.GetObjectRequest;
import com.obs.services.model.HeaderResponse;
import com.obs.services.model.HttpMethodEnum;
import com.obs.services.model.ObjectMetadata;
import com.obs.services.model.ObsObject;
import com.obs.services.model.ProgressListener;
import com.obs.services.model.ProgressStatus;
import com.obs.services.model.PutObjectResult;
import com.obs.services.model.TemporarySignatureRequest;
import com.obs.services.model.TemporarySignatureResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@Slf4j
@Component
public class HuaweiyunOssUtil {

    private static String ak;
    private static String sk;

    private static String bucketName;
    private static String endpoint;

    public static String getAk() {
        return ak;
    }

    public static void setAk(String ak) {
        HuaweiyunOssUtil.ak = ak;
    }

    public static String getSk() {
        return sk;
    }

    public static void setSk(String sk) {
        HuaweiyunOssUtil.sk = sk;
    }

    public static String getBucketName() {
        return bucketName;
    }

    public static void setBucketName(String bucketName) {
        HuaweiyunOssUtil.bucketName = bucketName;
    }

    public static String getEndpoint() {
        return endpoint;
    }

    public static void setEndpoint(String endpoint) {
        HuaweiyunOssUtil.endpoint = endpoint;
    }

    private static ObsClient obsClient = null;

    /**
     * 上传文件
     * path:文件路径
     *
     * @return
     */
    public static boolean uploadFile(String path) {
        try {
            initObsClient(ak, sk, endpoint);
            File file = new File(path);
            FileInputStream fis = new FileInputStream(file);
            PutObjectResult response = obsClient.putObject(bucketName, file.getName(), fis);
            // 可选：调用成功后，记录调用成功的HTTP状态码和服务端请求ID
            int statusCode = response.getStatusCode();
            obsClient.close();
            if (200 == statusCode) {
                return true;
            }

        } catch (IOException e) {
            log.info("文件上传失败：{}", e.getMessage(), e);
        }
        return false;
    }

    /**
     * 上传文件--流式
     *
     * @param fileName 上传文件名称
     * @param is       文件流
     * @return
     */
    public static boolean uploadFile(String fileName, InputStream is) {
        try {
            initObsClient(ak, sk, endpoint);
            HeaderResponse response = obsClient.putObject(bucketName, fileName, is);
            // 可选：调用成功后，记录调用成功的HTTP状态码和服务端请求ID
            int statusCode = response.getStatusCode();
            is.close();
            obsClient.close();
        } catch (ObsException e) {
            System.out.println("HTTP Code: " + e.getResponseCode());
            System.out.println("Error Code:" + e.getErrorCode());
            System.out.println("Request ID:" + e.getErrorRequestId());
            // 推荐：发生异常后，记录异常堆栈信息
            e.printStackTrace(System.out);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * @param fileName：文件名称
     * @Description: 下载
     * @Return: byte[]
     * @Author: llj
     * @Date: 2021/3/19 16:07
     */
    public static byte[] Download(String fileName, OutputStream out) throws IOException {

        initObsClient(ak, sk, endpoint);
        ObsObject obsObject = obsClient.getObject(bucketName, fileName);
        // 读取对象内容
        InputStream input = obsObject.getObjectContent();
        byte[] b = new byte[1024];
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int len;
        while ((len = input.read(b)) != -1) {
            out.write(b, 0, len);
        }
        out.close();
        input.close();
        obsClient.close();
        return bos.toByteArray();
    }

    /*
     * @Description:
     * @param [fileName]
     * @Return: void
     * @Author: llj
     * @Date: 2021/3/19 16:08
     */
    public static void DownloadChange(String fileName) throws IOException {
        // 创建ObsClient实例
        initObsClient(ak, sk, endpoint);
        GetObjectRequest request = new GetObjectRequest(bucketName, fileName);
        request.setProgressListener(new ProgressListener() {

            @Override
            public void progressChanged(ProgressStatus status) {
                // 获取下载平均速率
                System.out.println("AverageSpeed:" + status.getAverageSpeed());
                // 获取下载进度百分比
                System.out.println("TransferPercentage:" + status.getTransferPercentage());
            }
        });
        // 每上传1MB数据反馈下载进度
        request.setProgressInterval(1024 * 1024L);
        ObsObject obsObject = obsClient.getObject(request);

        // 读取对象内容
        System.out.println(obsObject.toString());
        InputStream input = obsObject.getObjectContent();
        byte[] b = new byte[1024];
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int len;
        while ((len = input.read(b)) != -1) {
            bos.write(b, 0, len);
        }
        System.out.println(new String(bos.toByteArray()));
        bos.close();
        input.close();
    }

    /**
     * 获取文件下载地址
     *
     * @param fileName 文件名称
     * @return
     */
    public static String getDownloadUrl(String fileName) {
        initObsClient(ak, sk, endpoint);
        // URL有效期，3600秒.5分钟
        long expireSeconds = 3600L;
        TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);
        request.setBucketName(bucketName);
        request.setObjectKey(fileName);
        TemporarySignatureResponse response = obsClient.createTemporarySignature(request);
        return response.getSignedUrl();
    }

    public static boolean chekckFile(String fileName) {
        initObsClient(ak, sk, endpoint);
        ObjectMetadata metadata = obsClient.getObjectMetadata(bucketName, fileName);
        if (metadata == null) {
            return false;
        }
        return true;

    }

    /**
     * @param fileName obs上桶下文件路径
     * @Description: 删除附件
     * @Return: boolean
     * @Author: llj
     * @Date: 2021/3/23 10:08
     */
    public static boolean deleteFile(String fileName) {
        try {
            initObsClient(ak, sk, endpoint);
            obsClient.deleteObject(bucketName, fileName);
            obsClient.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 初始化客户端
     *
     * @param ak
     * @param sk
     * @param endpoint
     * @return
     */
    private static ObsClient initObsClient(String ak, String sk, String endpoint) {
        obsClient = new ObsClient(ak, sk, endpoint);
        return obsClient;
    }
}

