package com.fs.common;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.fs.system.oss.CloudStorageService;
import com.fs.system.oss.OSSFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class QRutils {
    public static InputStream downloadAndEncodeImageToInputStream(String imageUrl) throws Exception {
        URL url = new URL(imageUrl);
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.connect();

        if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            try (InputStream inputStream = httpURLConnection.getInputStream();
                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                return new ByteArrayInputStream(outputStream.toByteArray());
            }
        } else {
            throw new Exception("Failed to download image. HTTP response code: " + httpURLConnection.getResponseCode());
        }
    }

    public static String embedQRCode(InputStream mainImageStream, InputStream qrCodeStream) throws IOException {
        // 输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // 从InputStream加载主图
        BufferedImage mainImage = ImageIO.read(mainImageStream);
        // 从InputStream加载二维码图片
        BufferedImage qrCodeImage = ImageIO.read(qrCodeStream);

        // 缩小二维码图片50%
//        int newWidth = (int)Math.round(qrCodeImage.getWidth() / 1.0);
//        int newHeight = (int)Math.round(qrCodeImage.getHeight() / 1.0);
        int newWidth =(int)Math.round(qrCodeImage.getWidth());
        int newHeight = (int)Math.round(qrCodeImage.getHeight());
        BufferedImage resizedQrCodeImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = resizedQrCodeImage.createGraphics();
        g.drawImage(qrCodeImage, 0, 0, newWidth, newHeight, null);
        g.dispose();

        // 创建一个新的BufferedImage对象，大小为主图的大小
        BufferedImage embeddedImage = new BufferedImage(mainImage.getWidth(), mainImage.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics gMain = embeddedImage.getGraphics();

        // 绘制主图
        gMain.drawImage(mainImage, 0, 0, null);

        // 在指定位置绘制二维码图片
//        g.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);
        // 计算二维码图片的放置位置（距主图左边宽10%，距离上边宽10%）
//        int qrCodeX = (int)Math.round(mainImage.getWidth() * 0.1); // 左边距1%
//        int qrCodeY = (int)Math.round(mainImage.getHeight() * 0.1); // 上边距1%
        int qrCodeX = (int)Math.round(250.0); // 左边距1%
        int qrCodeY = (int)Math.round(1160.0); // 上边距1%
        // 在指定位置绘制二维码图片
        gMain.drawImage(resizedQrCodeImage, qrCodeX, qrCodeY, null);

        // 释放图形上下文使用的系统资源
        gMain.dispose();

        // 将最终的图片写入到OutputStream
        ImageIO.write(embeddedImage, "png", outputStream);

        byte[] imageBytes = outputStream.toByteArray();
        CloudStorageService storage = OSSFactory.build();
        if (storage != null){
            return storage.uploadSuffix(imageBytes, ".jpg");
        } else {
            return null;
        }

    }


    /**
     * 生成二维码图片
     *
     * @param text 储存内容
     * @param width  宽度
     * @param height  高度
     * @return
     */
    public static InputStream getQRCodeImageInputStream(String text, int width, int height) {
        QrConfig config = new QrConfig(width, height);
        // 设置边距，既二维码和背景之间的边距
        config.setMargin(1);
        // 设置前景色，既二维码颜色（青色）
        config.setForeColor(Color.BLACK.getRGB());
        // 设置背景色（灰色）
        config.setBackColor(Color.WHITE.getRGB());
        // 生成二维码到文件，也可以到流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        QrCodeUtil.generate(text, config, ImgUtil.IMAGE_TYPE_PNG, outputStream);
//        InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
//        CloudStorageService storage = OSSFactory.build();
//        if (storage != null){
//            return storage.uploadSuffix(inputStream, ".jpg");
//        } else {
//            return null;
//        }
        return new ByteArrayInputStream(outputStream.toByteArray());

    }


    /**
     * 生成二维码
     *
     * @param text 储存内容
     * @param width  宽度
     * @param height  高度
     * @return
     */
    public static String getQRCodeBase64(String text, int width, int height) {
        QrConfig config = new QrConfig(width, height);
        // 设置边距，既二维码和背景之间的边距
        config.setMargin(1);
        // 设置前景色，既二维码颜色（青色）
        config.setForeColor(Color.BLACK.getRGB());
        // 设置背景色（灰色）
        config.setBackColor(Color.WHITE.getRGB());
        // 生成二维码到文件，也可以到流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        QrCodeUtil.generate(text, config, ImgUtil.IMAGE_TYPE_PNG, outputStream);
        byte[] pngData = outputStream.toByteArray();
        // 这个前缀，可前端加，可后端加，不加的话，不能识别为图片
        return "data:image/png;base64," + Base64.encode(pngData);
    }

    /**
     * 生成二维码
     *
     * @param text 储存内容
     * @param config 自定义配置
     * @return
     */
    public static String getQRCodeBase64(String text, QrConfig config) {
        // 生成二维码到文件，也可以到流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        QrCodeUtil.generate(text, config, ImgUtil.IMAGE_TYPE_PNG, outputStream);
        byte[] pngData = outputStream.toByteArray();
        return "data:image/png;base64," + Base64.encode(pngData);
    }


    public static void main(String[] args) {
        QrConfig config = new QrConfig(100, 100);
        // 设置边距，既二维码和背景之间的边距
        config.setMargin(3);
        // 设置前景色，既二维码颜色（青色）
        config.setForeColor(Color.CYAN.getRGB());
        // 设置背景色（灰色）
        config.setBackColor(Color.GRAY.getRGB());
        // 生成二维码到文件，也可以到流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        QrCodeUtil.generate("wawaw", config, ImgUtil.IMAGE_TYPE_PNG, outputStream);
        byte[] pngData = outputStream.toByteArray();
        System.out.println(Base64.encode(pngData));
    }

}
