package com.ruoyi.common.utils;

import cn.hutool.core.io.IoUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import cn.hutool.extra.qrcode.QrCodeException;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * 二维码生成工具类（基于Hutool + ZXing，适配Java8 + SpringBoot）
 * 核心功能：根据code生成二维码字节数组（接口返回）、生成二维码文件（本地保存）
 */
public class CodeUtil {

    // 二维码默认配置：宽度300px，高度300px，边距1，编码UTF-8
    private static final QrConfig DEFAULT_QR_CONFIG = new QrConfig(300, 300)
            .setMargin(1)
            .setCharset(Charset.forName("UTF-8"));

    /**
     * 生成二维码字节数组（用于SpringBoot接口直接返回图片）
     * @param code 二维码内容（如链接、编号、文本等）
     * @return 二维码图片字节数组（PNG格式）
     * @throws QrCodeException 二维码生成异常
     * @throws IOException 字节流操作异常
     */
    public static byte[] generateQrCodeBytes(String code) throws QrCodeException, IOException {
        if (code == null || code.trim().isEmpty()) {
            throw new IllegalArgumentException("二维码内容（code）不能为空");
        }

        // 字节输出流，用于存储二维码图片字节
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            // Hutool核心方法：生成二维码并写入字节流
            QrCodeUtil.generate(
                    code,                // 二维码内容
                    DEFAULT_QR_CONFIG,   // 配置（宽高、边距、编码）
                    "PNG",               // 图片格式（PNG/JPG）
                    outputStream         // 输出流
            );
            return outputStream.toByteArray();
        } finally {
            // 关闭流，避免资源泄漏（Java8 try-finally 规范）
            IoUtil.close(outputStream);
        }
    }

}
