package com.fastbee.data.controller.printer.yilianyun;


import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fastbee.iot.domain.DeviceReportInfo;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class GenerateQRCodeImage {

	//设备激活接口地址
	private static final String ACTIVATE_URL = "https://open.10ss.net:8443/api/activate";

	public static String generateQRCodeUrl(DeviceReportInfo deviceReportInfo){
		try {
			// 二维码内容
			Map<String,Object> qrCodeContent=new HashMap<>();
			qrCodeContent.put("deviceName",deviceReportInfo.getName());
			qrCodeContent.put("deviceCode",deviceReportInfo.getSerialNumber());
			String qrCodeContentStr=JSONUtil.toJsonStr(qrCodeContent);

			// 生成二维码
			BitMatrix bitMatrix = generateQRCode(qrCodeContentStr, 200, 200);

			// 将二维码转换为BufferedImage
			BufferedImage qrCodeImage = MatrixToImageWriter.toBufferedImage(bitMatrix);

			// 创建一个新的BufferedImage，包含二维码和文字
			int qrCodeWidth = qrCodeImage.getWidth();
			int qrCodeHeight = qrCodeImage.getHeight();
			int textWidth = 200; // 文字区域宽度
			int imageWidth = qrCodeWidth + textWidth + 30; // 间距20像素
			int imageHeight = qrCodeHeight;

			BufferedImage finalImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);
			Graphics2D g2d = finalImage.createGraphics();

			// 绘制背景颜色
			g2d.setColor(Color.WHITE);
			g2d.fillRect(0, 0, imageWidth, imageHeight);

			// 绘制二维码
			g2d.drawImage(qrCodeImage, 20, 10, qrCodeWidth, qrCodeHeight, null);
			//绘制虚线矩形
			Stroke dashed = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{10}, 0);
			g2d.setStroke(dashed);
			// 设置颜色
			g2d.setColor(Color.BLACK);
			// 绘制虚线矩形
			g2d.drawRect(50, 41, qrCodeImage.getWidth()-62, qrCodeImage.getHeight()-62);
			// 绘制文字
			g2d.setColor(Color.BLACK);
			g2d.setFont(new Font("WenQuanYi Micro Hei", Font.BOLD, 20));
			// 绘制第一段文字
			String text1 = deviceReportInfo.getName();
			FontMetrics fontMetrics = g2d.getFontMetrics();


			int textX = qrCodeWidth-5; // 问文本与二维码的水平间距



			int textY1 = (imageHeight - fontMetrics.getHeight()) / 2 + fontMetrics.getAscent()-55;


			g2d.drawString(text1, textX, textY1);

			// 绘制第二段文字
			String text2 = "◉系列:"+deviceReportInfo.getMcuFw();
			g2d.setFont(new Font("WenQuanYi Micro Hei", Font.BOLD, 18));


			int textY2 = textY1 + fontMetrics.getHeight() + 10; // 在第一段文字下方添加一些间距


			g2d.drawString(text2, textX, textY2);
			// 绘制第三段文字
			String text3 = "◉型号:" + deviceReportInfo.getBspType()+deviceReportInfo.getLteType()+"";


			int textY3 = textY2 + fontMetrics.getHeight() + 10; // 在第一段文字下方添加一些间距


			g2d.drawString(text3, textX, textY3);
			//绘制第三段文字
			String text4 = "◉批次:" + deviceReportInfo.getBatchNumber();


			int textY4 = textY3 + fontMetrics.getHeight() + 10; // 在第一段文字下方添加一些间距


			g2d.drawString(text4, textX, textY4);
			//绘制第五段文字
			// 确保Graphics2D对象的当前颜色是黑色（如果不是的话）
			g2d.setColor(Color.BLACK);
			// 计算文本宽度和高度
			String text5 ="   SN:"+deviceReportInfo.getSerialNumber()+"   ";

			 textWidth = fontMetrics.stringWidth(text5);
			int textHeight = fontMetrics.getHeight();
			// 计算矩形区域的X和Y坐标（留出内边距）
			int rectX = textX; // 左内边距


			int rectY = textY4+10; // 上内边距，确保文本顶部与矩形内部有一定的空间


			// 为了确保文本完全在矩形内，我们可以稍微调整rectHeight
			int rectHeight = textHeight + 10; // 文本高度加上上下内边距
			// 绘制黑色背景矩形
			g2d.fillRect(rectX, rectY, textWidth + 10, rectHeight);
			// 设置Graphics2D对象的当前颜色为白色
			g2d.setColor(Color.WHITE);


			// 绘制第四段文字
			int textY5 = textY4 + fontMetrics.getHeight() + 10; // 在前一段文字下方添加间距


			g2d.drawString(text5, textX, textY5); // 绘制白色文本
			// 释放Graphics2D资源
			g2d.dispose();

			// 保存图片到临时文件
			Path tempFilePath = Files.createTempFile("qrCode", ".png");
			File outputFile = tempFilePath.toFile();
			ImageIO.write(finalImage, "png", outputFile);

			// 上传图片到服务器
			String uploadUrl = "http://101.201.244.214:13088/common/upload";
			JSONObject uploaded = uploadImage(uploadUrl, outputFile);
			String url = uploaded.getStr("url");

			// 删除临时文件
			Files.delete(tempFilePath);
//			System.out.println("二维码和文字图片已生成：" + outputFile.getAbsolutePath());
			return url;
		} catch (WriterException | IOException e) {
			e.printStackTrace();
			throw new RuntimeException("设备激活二维码图片生成失败！");
		}
	}

	private static BitMatrix generateQRCode(String text, int width, int height) throws WriterException {
		Map<EncodeHintType, Object> hints = new HashMap<>();
		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
		return new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
	}

	private static JSONObject uploadImage(String uploadUrl, File file) throws IOException {
		// 创建一个表单请求
		HttpRequest request = HttpUtil.createPost(uploadUrl);
		// 添加文件参数
		request.form("file", getFileBytes(file), file.getName());
		// 发送请求
		String response = request.execute().body();
//		System.out.println("服务器响应：" + response);
		JSONObject resp = JSONUtil.parseObj(response);
		if(!resp.getStr("code").equals("200")){
			throw new RuntimeException("设备激活二维码上传失败！");
		}
		return resp;
	}
	/**
	 * 获取文件的字节数组
	 */
	public static byte[] getFileBytes(File file) throws IOException {
		if (!file.exists() || file.isDirectory()) {
			throw new IllegalArgumentException("输入的不是有效的文件");
		}
		return Files.readAllBytes(Paths.get(file.getAbsolutePath()));
	}

	public static void main(String[] args) {
		// 创建DeviceReportInfo对象实例
		DeviceReportInfo deviceReportInfo = new DeviceReportInfo();

		// 依次设置各个属性值
		deviceReportInfo.setImei("1231212");
		deviceReportInfo.setIccid("121212122");
		deviceReportInfo.setMcuId("MCU0023");
		deviceReportInfo.setBspType("RF500A");
		deviceReportInfo.setLteType("780E");
		deviceReportInfo.setMcuType("MCU型号Z");
		deviceReportInfo.setMcuFw("RF345X");
		deviceReportInfo.setLteFw("模组固件V2.1");
		deviceReportInfo.setLcdManufacturer(2L);
		deviceReportInfo.setVoiceManufacturer(5L);
		deviceReportInfo.setFramModel("FRAM-200");
		deviceReportInfo.setReplaceManufacturer(9L);
		deviceReportInfo.setTestRecord("测试脉冲次数为3次，第一次上电时间是2024-12-09");
		deviceReportInfo.setBatchNumber("RF500 齐河 780E");

		// 对于示例JSON数据中未包含但类中定义了的属性，这里可以按需设置默认值（此处仅为示例，可按实际需求调整）
		deviceReportInfo.setSerialNumber("默认设备编号");
		deviceReportInfo.setQrCode("默认二维码");
		deviceReportInfo.setName("默认设备名称");
		deviceReportInfo.setLcdManufacturerName("默认LCD厂家名称");
		deviceReportInfo.setVoiceManufacturerName("默认语音厂家名称");
		deviceReportInfo.setReplaceManufacturerName("默认代工厂家名称");
		deviceReportInfo.setDeviceId(0L);
		String url = GenerateQRCodeImage.generateQRCodeUrl(deviceReportInfo);
		System.err.println(url);
	}
}