package com.pig4cloud.pig.marketing.api.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 指纹组合工具类
 */
public class FingerprintCombinerUtil {

    /**
     * 组合前端指纹和后端指纹
     * @param frontFingerprint 前端传入的指纹（可为null）
     * @param backendFingerprint 后端生成的指纹（可为null）
     * @return 组合后的唯一指纹（32位MD5或64位SHA-256）
     */
    public static String combine(String frontFingerprint, String backendFingerprint) {
        // 处理空值（空字符串替换为"null"，避免拼接后差异丢失）
        String front = (frontFingerprint == null || frontFingerprint.trim().isEmpty()) 
            ? "null" : frontFingerprint.trim();
        String backend = (backendFingerprint == null || backendFingerprint.trim().isEmpty()) 
            ? "null" : backendFingerprint.trim();
        
        // 固定顺序拼接（前端+分隔符+后端）
        String combined = front + "|" + backend;
        
        // 生成SHA-256哈希（推荐，比MD5更安全）
        return generateSha256(combined);
//		return generateMd5(combined);
    }

    /**
     * 生成SHA-256哈希
     */
    private static String generateSha256(String input) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
            
            // 转换为16进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                String hex = String.format("%02x", b);
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            // 异常时降级为MD5（理论上SHA-256是JDK标配，此处为容错）
            return generateMd5(input);
        }
    }

    /**
     * 生成MD5哈希（降级方案）
     */
    private static String generateMd5(String input) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
            
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                hexString.append(String.format("%02x", b));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
			return input.length() >= 32 ? input.substring(0, 32) : input;
        }
    }
}