package cn.estsh.i3plus.ext.mes.pcn.apiservice.util;

import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
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 com.google.zxing.datamatrix.encoder.SymbolShapeHint;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.lang3.StringUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description : 描述
 * @Reference : 关联
 * @Author : duan.yang
 * @CreateDate : 2021-09-03 15:54
 * @Modify: 修改
 **/
public class BarCodeUtils {
    public static ByteArrayOutputStream createBarCode(String code) throws WriterException, IOException {
        // 二维码基本参数设置
        Map<EncodeHintType, Object> hints = new HashMap<>();
        // 设置编码字符集utf-8
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别，当前设置等级为最高等级H，最低L
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 可设置距离边界的范围0-10
        hints.put(EncodeHintType.MARGIN, 1);
        // 生成图片类型为条码
        BarcodeFormat format = BarcodeFormat.CODE_39;
        // 创建位矩阵对象
        BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.CODE_93_WIDTH, MesPcnExtConstWords.CODE_93_HEIGHT, hints);
        // 设置位矩阵转图片的参数
        // MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
        // 位矩阵对象转流对象
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "png", os);
        return os;
    }

    public static ByteArrayOutputStream createPalletBarCode(String code) throws WriterException, IOException {
        // 二维码基本参数设置
        Map<EncodeHintType, Object> hints = new HashMap<>();
        // 设置编码字符集utf-8
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别，当前设置等级为最高等级H，最低L
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 可设置距离边界的范围0-10
        hints.put(EncodeHintType.MARGIN, 1);
        // 生成图片类型为条码
        BarcodeFormat format = BarcodeFormat.CODE_93;
        // 创建位矩阵对象
        BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.PALLET_CODE_93_WIDTH, MesPcnExtConstWords.PALLET_CODE_93_HEIGHT, hints);
        // 设置位矩阵转图片的参数
        // MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
        // 位矩阵对象转流对象
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "png", os);
        return os;
    }

    public static ByteArrayOutputStream createPalletBarCodeToQr(String code) throws WriterException, IOException {
        // 二维码基本参数设置
        Map<EncodeHintType, Object> hints = new HashMap<>();
        // 设置编码字符集utf-8
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别，当前设置等级为最高等级H，最低L
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 可设置距离边界的范围0-10
        hints.put(EncodeHintType.MARGIN, 1);
        // 生成图片类型为二维码
        BarcodeFormat format = BarcodeFormat.QR_CODE;
        // 创建位矩阵对象
        BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.PALLET_QR_CODE_LENTH, MesPcnExtConstWords.PALLET_QR_CODE_LENTH, hints);
        // 设置位矩阵转图片的参数
        // MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
        // 位矩阵对象转流对象
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "png", os);
        return os;
    }

    public static ByteArrayOutputStream createDataMatrixCode(String code) throws WriterException, IOException {
        // 二维码基本参数设置
        Map<EncodeHintType, Object> hints = new HashMap<>();
        // 设置编码字符集utf-8
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 设置纠错等级L/M/Q/H,纠错等级越高越不易识别，当前设置等级为最高等级H，最低L
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        //DATA_MATRIX_SHAPE设置二维码的形状，如果不设置会默认为null,FORCE_SQUARE为正方形
        hints.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE);
        // 可设置距离边界的范围0-10
        hints.put(EncodeHintType.MARGIN, 1);
        // 生成图片类型为数字矩阵
        BarcodeFormat format = BarcodeFormat.DATA_MATRIX;
        // 创建位矩阵对象
        BitMatrix bitMatrix = new MultiFormatWriter().encode(code, format, MesPcnExtConstWords.DATA_MATRIX_CODE_WIDTH, MesPcnExtConstWords.DATA_MATRIX_CODE_HEIGHT, hints);
        // 设置位矩阵转图片的参数
//        MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
        //输出图片文件
//        MatrixToImageWriter.writeToPath(bitMatrix, "png", Paths.get("D://sn.png"));
        // 位矩阵对象转流对象
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "png", os);
        return os;
    }

    //不过滤":"，tesla零件号带冒号
    //不过滤[)>字符
    public static String removePatternSpecialCharacter(String barCode) {
        if (StringUtils.isEmpty(barCode)) return MesPcnExtConstWords.EMPTY;
        return StringUtils.removePattern(barCode, "[^A-Z^a-z0-9_^\\s^\\-^/^\\.^\\[^\\)^\\>^\\:]");
    }
}
