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

package com.yami.shop.common.config;

import cn.hutool.crypto.symmetric.AES;
import com.yami.shop.common.bean.AliDaYu;
import com.yami.shop.common.bean.ImgUpload;
import com.yami.shop.common.bean.Qiniu;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * `ShopBeanConfig`类是一个Spring的配置类，主要负责创建和配置项目中一些常用的Bean实例，这些Bean通常是与业务相关的配置类或者工具类的实例，
 * 通过依赖注入获取相关的配置信息，并将其封装成对应的Bean提供给Spring容器管理，方便在整个项目的其他地方可以通过依赖注入的方式获取并使用这些实例，
 * 以此来实现配置信息的统一管理和复用，确保各个业务模块能够方便地获取到所需的配置参数和工具类实例来执行相应的业务逻辑。
 *
 * @author lanhai
 */
@Configuration // 表明这个类是一个Spring的配置类，Spring容器会在启动时扫描并解析此类中的配置信息，用于创建和管理相关的Bean。
@AllArgsConstructor // 通过Lombok生成包含所有参数的构造函数，这里用于注入 `ShopBasicConfig` 实例，方便获取其中的配置信息来创建其他Bean。
public class ShopBeanConfig {

    // 通过构造函数注入的 `ShopBasicConfig` 实例，它应该包含了项目中各种基础的配置信息，例如七牛云相关配置、加密密钥、短信配置（对应 `AliDaYu`）以及图片上传相关配置等，
    // 作为创建其他Bean的数据源，从它里面提取相应的配置信息来实例化具体的Bean对象。
    private final ShopBasicConfig shopBasicConfig;

    /**
     * 创建并返回 `Qiniu` 类型的Bean实例，用于七牛云相关的业务操作，比如文件存储到七牛云等操作。
     * 这个方法通过调用 `shopBasicConfig` 的 `getQiniu` 方法获取已经配置好的 `Qiniu` 对象，然后将其作为Spring容器管理的Bean返回，
     * 使得在项目中其他需要使用七牛云功能的地方可以方便地通过依赖注入获取这个 `Qiniu` 实例进行相关操作。
     *
     * @return 返回从 `ShopBasicConfig` 中获取的 `Qiniu` 实例，作为Spring容器中的一个Bean，供七牛云相关业务使用。
     */
    @Bean
    public Qiniu qiniu() {
        return shopBasicConfig.getQiniu();
    }

    /**
     * 创建并返回 `AES` 类型的加密工具类的Bean实例，`AES` 是一种常用的对称加密算法，这里用于对项目中的某些数据（可能是用户令牌等敏感信息）进行加密和解密操作。
     * 通过获取 `shopBasicConfig` 中的 `tokenAesKey`（应该是加密密钥相关信息）并转换为字节数组来实例化 `AES` 对象，然后将其作为Bean交给Spring容器管理，
     * 方便在需要进行加密或解密操作的业务逻辑中通过依赖注入获取该实例来执行相应的操作，保障数据的安全性。
     *
     * @return 返回一个配置好的 `AES` 实例，作为Spring容器中的一个Bean，用于数据加密和解密相关业务。
     */
    @Bean
    public AES tokenAes() {
        return new AES(shopBasicConfig.getTokenAesKey().getBytes());
    }

    /**
     * 创建并返回 `AliDaYu` 类型的Bean实例，`AliDaYu` 可能是与阿里云短信服务（短信发送等相关功能）对应的配置类或者业务操作类，
     * 通过从 `shopBasicConfig` 中获取已经配置好的 `AliDaYu` 对象并返回，使得在项目中需要发送短信等与阿里云短信服务相关的业务逻辑可以通过依赖注入获取该实例进行操作，
     * 实现了短信服务相关配置和功能的统一管理和使用。
     *
     * @return 返回从 `ShopBasicConfig` 中获取的 `AliDaYu` 实例，作为Spring容器中的一个Bean，供阿里云短信服务相关业务使用。
     */
    @Bean
    public AliDaYu aLiDaYu() {
        return shopBasicConfig.getALiDaYu();
    }

    /**
     * 创建并返回 `ImgUpload` 类型的Bean实例，用于管理图片上传相关的配置信息，比如本地文件上传路径、上传方式以及网站资源访问地址等，
     * 通过获取 `shopBasicConfig` 中的 `ImgUpload` 对象并返回，使得在项目中涉及图片上传业务逻辑的地方可以方便地通过依赖注入获取该实例来获取相应的配置参数，
     * 确保图片上传功能能够按照配置的要求正确执行，比如选择合适的上传方式、存储到正确的路径等。
     *
     * @return 返回从 `ShopBasicConfig` 中获取的 `ImgUpload` 实例，作为Spring容器中的一个Bean，供图片上传相关业务使用。
     */
    @Bean
    public ImgUpload imgUpload() {
        return shopBasicConfig.getImgUpload();
    }
}