package com.malk.tonglibo.utils;

import com.malk.tonglibo.entity.MachineData;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 功能：
 * 作者：hanxue
 * 日期：2025/10/20 9:34
 */
@Component
public class ChangeDetector {
    // 存储每个设备最新的数据指纹
    private final Map<String, String> lastFingerprintMap = new ConcurrentHashMap<>();

    /**
     * 判断当前数据是否为新状态（MD5 指纹不同）
     */
    public boolean isChanged(MachineData data) {
        String machineNo = data.getMachineNo();
        String fingerprint = generateFingerprint(data);

        String lastFingerprint = lastFingerprintMap.get(machineNo);
        if (lastFingerprint == null) {
            return true; // 第一次上报，算变化
        }

        return !lastFingerprint.equals(fingerprint);
    }

    /**
     * 记录当前指纹为最新状态
     */
    public void recordAsCurrent(String machineNo, String fingerprint) {
        lastFingerprintMap.put(machineNo, fingerprint);
    }

    String concatFields(MachineData data) {
        return new StringBuilder()
                .append(defaultString(data.getJqyxsh()))
                .append(defaultString(data.getZcn()))
                .append(defaultString(data.getZqsj()))
                .append(defaultString(data.getSgdyl()))
                .append(defaultString(data.getXgdyl()))
                .append(defaultString(data.getYskqyl1()))
                .append(defaultString(data.getYskqyl2()))
                .append(defaultString(data.getZymwd1()))
                .append(defaultString(data.getZymwd2()))
                .append(defaultString(data.getZymwd3()))
                .append(defaultString(data.getZymwd4()))
                .append(defaultString(data.getSmwd1()))
                .append(defaultString(data.getSmwd2()))
                .append(defaultString(data.getSmwd3()))
                .append(defaultString(data.getSmwd4()))
                .append(defaultString(data.getXmwd1()))
                .append(defaultString(data.getXmwd2()))
                .append(defaultString(data.getXmwd3()))
                .append(defaultString(data.getXmwd4()))
                .append(defaultString(data.getXjsj()))
                .append(defaultString(data.getTssj()))
                .append(defaultString(data.getZysj()))
                .append(defaultString(data.getDn()))
                .toString();
    }

    private String generateFingerprint(MachineData data) {
        String content = concatFields(data);
        return MD5Util.md5(content);
    }

    private String defaultString(String str) {
        return str == null ? "" : str;
    }

}
