package com.njcn.gather.icd.mapping.infrastructure.parser;

import com.njcn.gather.icd.mapping.pojo.bo.icd.DoiElementNode;
import com.njcn.gather.icd.mapping.pojo.bo.icd.DoiNode;
import com.njcn.gather.icd.mapping.pojo.bo.icd.FcdaNode;

import java.util.ArrayList;
import java.util.List;

/**
 * SCL 遍历辅助工具。
 *
 * 提供序列数量统计和 DOI 叶子节点展开等公共能力。
 */
public final class SclTraversalSupport {

    private SclTraversalSupport() {
    }

    /**
     * 统计同一数据对象在数据集中的出现次数，作为 ICD 实际序列数量的参考值。
     */
    public static int calculateSequenceCount(List<FcdaNode> allFcdas, FcdaNode current) {
        int count = 0;
        for (FcdaNode item : allFcdas) {
            if (safeEquals(item.getLnClass(), current.getLnClass())
                    && safeEquals(item.getLnInst(), current.getLnInst())
                    && safeEquals(item.getDoName(), current.getDoName())) {
                count++;
            }
        }
        return count <= 1 ? 0 : count;
    }

    /**
     * 展开 DOI 树下所有 DAI 节点，便于后续读取单位、倍率等叶子值。
     */
    public static List<DoiElementNode> flattenLeafDai(DoiNode doi) {
        List<DoiElementNode> result = new ArrayList<DoiElementNode>();
        if (doi == null || doi.getChildren() == null) {
            return result;
        }
        for (DoiElementNode child : doi.getChildren()) {
            collectLeafDai(child, result);
        }
        return result;
    }

    /**
     * 递归收集 DAI 叶子节点。
     */
    private static void collectLeafDai(DoiElementNode node, List<DoiElementNode> result) {
        if (node == null) {
            return;
        }
        if ("DAI".equals(node.getKind())) {
            result.add(node);
        }
        if (node.getChildren() != null) {
            for (DoiElementNode child : node.getChildren()) {
                collectLeafDai(child, result);
            }
        }
    }

    /**
     * 空安全字符串比较，供解析阶段统计序列数量使用。
     */
    public static boolean safeEquals(String a, String b) {
        return a == null ? b == null : a.equals(b);
    }
}