package com.ningdatech.carapi.common.util;

import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @description: 二维码生成
 * @author: liushuai
 * @date: 2022/8/11 15:04
 */
@Slf4j
public class QrCoder {
    /**
     * 图片的宽度
     */
    private static final int IMAGE_WIDTH = 150;
    /**
     * 图片的高度(需按实际内容高度进行调整)
     */
    private static final int IMAGE_HEIGHT = 150;
    /**
     * 二维码的宽度
     */
    private static final int QR_CODE_WIDTH = 145;
    /**
     * 二维码的高度
     */
    private static final int QR_CODE_HEIGHT = 145;


    /**
     * @param content 内容
     * @param footer  底部文字
     */
    public static BufferedImage createQrCode(String content, String footer) {
        // 创建主模板图片
        BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D main = image.createGraphics();
        // 设置图片的背景色
        main.setColor(Color.white);
        main.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);

        // 动态高度
        int height = 0;

        //***************插入二维码图片***********************************************
        Graphics codePic = image.getGraphics();
        BufferedImage codeImg;
        QrConfig config = new QrConfig();
        config.setWidth(QR_CODE_WIDTH);
        config.setHeight(QR_CODE_HEIGHT);
        config.setMargin(0);
        codeImg = QrCodeUtil.generate(content, config);
        // 绘制二维码
        codePic.drawImage(codeImg, (IMAGE_WIDTH - QR_CODE_WIDTH) / 2, height, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
        codePic.dispose();

        //**********************底部文字描述******************************************
        Graphics2D typeLeft = image.createGraphics();
        // 设置字体颜色
        typeLeft.setColor(Color.black);
        // 设置字体
        Font footerFont = new Font("宋体", Font.PLAIN, 14);
        typeLeft.setFont(footerFont);
        typeLeft.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        // x开始的位置：（图片宽度-字体大小*字的个数）/2
        int startX = (IMAGE_WIDTH - (footerFont.getSize() * footer.length())) / 2 + 25;
        height += QR_CODE_HEIGHT + 2.5;
        typeLeft.drawString(footer, startX, height);

        // 返回image方便后续处理是生成图片还是生成base64字符串
        return image;
    }


    /**
     * 生成图片文件
     *
     * @param image        图片
     * @param fileLocation 地址
     */
    public static void createImage(BufferedImage image, String fileLocation) {
        if (image != null) {
            try {
                ImageIO.write(image, "jpg", new File(fileLocation));
            } catch (IOException e) {
                log.error("二维码生成图片失败:", e);
            }
        }
    }

    public static void main(String[] args) {
        BufferedImage bufferedImage = createQrCode("https://www.baidu.com", "编码：N20220001");
        createImage(bufferedImage, "/Users/qinxianyun/Downloads/test.jpg");
    }

}
