package com.tzy.common.utils;

import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.util.Base64;

public class Base64Util {

    public static byte[] decode(String encodedText){
    /** 解码  */
        final Base64.Decoder decoder = Base64.getDecoder();
        return decoder.decode(encodedText);
    }
    public static byte[] decodeMime(String encodedText){
    /** 解码  */
        final Base64.Decoder decoder = Base64.getMimeDecoder();
        return decoder.decode(encodedText);
    }
    /** 编码 */
    public static String encode(byte[] data){
        final Base64.Encoder encoder = Base64.getEncoder();
        return encoder.encodeToString(data);
    }

    public static String Base64Encode(String str) throws UnsupportedEncodingException {
        return new BASE64Encoder().encode(str.getBytes("UTF-8"));
    }
    /**
     * 按字节截取字符串
     * @param str
     * @param bytes
     * @return
     */
    public static String subStringByBytes(String str, int bytes) {
        if (str == null || str.length() == 0) {
            return str;
        }
        int len = 0;
        for (int i=0; i<str.length(); i++ ) {
            //GBK 编码格式 中文占两个字节 UTF-8 编码格式中文占三个字节;
            len += (str.charAt(i)>255 ? 3 : 1);

            if(len>bytes){
                return BeanUtil.checkChar(BeanUtil.regSpecial1,str.substring(0,i));
            }
        }
        return BeanUtil.checkChar(BeanUtil.regSpecial1,str);
    }


    /**
     * 根据给定的 Base64 编码字符串中的换行符和特殊字符的存在情况，
     * 自动选择使用 {@link Base64#getDecoder()} 或 {@link Base64#getMimeDecoder()}
     * 来解码数据。
     *
     * @param encodedData 待解码的 Base64 编码字符串
     * @return 解码后的原始二进制数据
     */
    public static byte[] decodeV2(String encodedData){
        if (containsMimeSpecialChars(encodedData) || containsLineBreaks(encodedData)) {
            return Base64.getMimeDecoder().decode(encodedData);
        } else {
            return Base64.getDecoder().decode(encodedData);
        }
    }

    /**
     * 检查给定的 Base64 编码字符串是否包含 MIME Base64 特有的 `-` 或 `_` 字符。
     *
     * @param encodedData 待检查的 Base64 编码字符串
     * @return 若字符串包含 MIME 特殊字符，则返回 true；否则返回 false
     */
    private static boolean containsMimeSpecialChars(String encodedData) {
        return encodedData.contains("-") || encodedData.contains("_");
    }

    /**
     * 检查给定的 Base64 编码字符串是否包含换行符 (`\r` 或 `\n`)。
     *
     * @param encodedData 待检查的 Base64 编码字符串
     * @return 若字符串包含换行符，则返回 true；否则返回 false
     */
    private static boolean containsLineBreaks(String encodedData) {
        return encodedData.contains("\r") || encodedData.contains("\n");
    }

    public static void main(String[] args) {
        // Hello world in standard Base64
        String standardBase64 = "SGVsbG8gd29ybGQ=";

        // Hello world in MIME Base64 with line break
        String mimeBase64 = "SGVsbG8gd29ybGQ=\r\n";
        System.out.println(encode("#:/UCj7A9U".getBytes()));
        try {
            // Outputs: Hello world
            //System.out.println(new String(decodeV2(standardBase64), StandardCharsets.UTF_8));
            // Outputs: Hello world
           // System.out.println(new String(decodeV2(mimeBase64), StandardCharsets.UTF_8));
        } catch (Exception e) {
            System.err.println("Error decoding Base64 data: " + e.getMessage());
        }
    }
}
