/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

package com.yami.shop.common.config;

import com.yami.shop.common.bean.ImgUpload;
import com.yami.shop.common.enums.QiniuZone;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.qiniu.common.Zone;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.yami.shop.common.bean.Qiniu;

import java.util.Objects;

/**
 * 该类是文件上传相关的配置类，主要用于配置七牛云文件上传服务所需的各种组件实例，例如配置七牛云的存储区域、
 * 创建上传管理实例、认证信息实例以及空间管理实例等，通过 Spring 的配置机制（@Configuration 和 @Bean 注解）将这些实例注入到 Spring 容器中，
 * 方便在文件上传相关的业务逻辑中进行使用，使得文件上传功能能够与七牛云服务进行有效的集成。
 *
 * @author lgh
 */
@Configuration
public class FileUploadConfig {

    // 通过 Spring 的自动注入机制，将 Qiniu 类型的配置对象注入到当前类中，该对象应该包含了七牛云服务相关的配置信息，如密钥、存储区域等。
    @Autowired
    private Qiniu qiniu;

    /**
     * 根据配置文件中的机房区域设置，创建并返回七牛云存储的配置实例（com.qiniu.storage.Configuration），
     * 此配置实例指定了七牛云存储服务所使用的机房区域（Zone），通过判断配置对象（qiniu）中的机房区域枚举值（QiniuZone），
     * 来选择对应的七牛云 Zone 实例，从而确定文件存储的具体机房位置，影响文件上传和存储的相关操作。
     *
     * @return 七牛云存储的配置实例，包含了选定的机房区域信息，用于后续七牛云相关服务实例的创建和操作。
     */
    @Bean
    public com.qiniu.storage.Configuration qiniuConfig() {
        Zone zone = null;
        // 判断配置对象中的机房区域枚举值是否为华北区（HUA_BEI），如果是，则创建对应的七牛云华北区 Zone 实例。
        if (Objects.equals(qiniu.getZone(), QiniuZone.HUA_BEI)) {
            zone = Zone.huabei();
        } 
        // 判断是否为华东区（HUA_DONG），若是，则创建华东区 Zone 实例。
        else if (Objects.equals(qiniu.getZone(), QiniuZone.HUA_DONG)) {
            zone = Zone.huadong();
        } 
        // 判断是否为华南区（HUA_NAN），若是，则创建华南区 Zone 实例。
        else if (Objects.equals(qiniu.getZone(), QiniuZone.HUA_NAN)) {
            zone = Zone.huanan();
        } 
        // 判断是否为北美区（BEI_MEI），若是，则创建北美区 Zone 实例。
        else if (Objects.equals(qiniu.getZone(), QiniuZone.BEI_MEI)) {
            zone = Zone.beimei();
        } 
        // 判断是否为新加坡区（XIN_JIA_PO），若是，则创建新加坡区 Zone 实例。
        else if (Objects.equals(qiniu.getZone(), QiniuZone.XIN_JIA_PO)) {
            zone = Zone.xinjiapo();
        }
        // 使用选定的 Zone 实例创建并返回七牛云存储的配置实例，用于后续的七牛云服务操作。
        return new com.qiniu.storage.Configuration(zone);
    }

    /**
     * 创建并返回一个七牛云的上传管理实例（UploadManager），该实例用于执行文件上传到七牛云存储的具体操作，
     * 它依赖于前面创建的七牛云存储配置实例（qiniuConfig() 方法返回的对象）来确定上传操作的相关配置，如机房区域等信息，
     * 使得在进行文件上传时能够按照正确的配置与七牛云服务进行交互。
     *
     * @return 七牛云的上传管理实例，可用于在业务代码中调用其方法实现文件上传到七牛云存储的功能。
     */
    @Bean
    public UploadManager uploadManager() {
        return new UploadManager(qiniuConfig());
    }

    /**
     * 创建并返回一个七牛云的认证信息实例（Auth），该实例用于生成七牛云服务调用所需的认证凭证，通过配置对象（qiniu）中的访问密钥（accessKey）和秘密密钥（secretKey），
     * 按照七牛云的认证机制创建认证对象，使得后续与七牛云存储、空间管理等服务进行交互时能够进行身份验证，确保请求的合法性和安全性。
     *
     * @return 七牛云的认证信息实例，包含了基于配置的访问密钥和秘密密钥生成的认证凭证，用于七牛云服务调用时的身份验证。
     */
    @Bean
    public Auth auth() {
        return Auth.create(qiniu.getAccessKey(), qiniu.getSecretKey());
    }

    /**
     * 创建并返回一个七牛云的空间管理实例（BucketManager），该实例用于对七牛云存储中的空间（Bucket）进行管理操作，
     * 例如文件的删除、查看空间信息等操作，它依赖于前面创建的认证信息实例（auth() 方法返回的对象）进行身份验证，
     * 同时也依赖于七牛云存储配置实例（qiniuConfig() 方法返回的对象）来确定相关操作的配置信息，确保空间管理操作能够在正确的配置环境下进行。
     *
     * @return 七牛云的空间管理实例，可用于在业务代码中调用其方法实现对七牛云存储空间的管理功能。
     */
    @Bean
    public BucketManager bucketManager() {
        return new BucketManager(auth(), qiniuConfig());
    }
}