package com.aps.macroplanner.output.dto;

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

/**
 * 产品生产网络结果 — 从成品向下逐级展开的完整 BOM 供应链视图。
 *
 * <h3>对应关系</h3>
 * <pre>
 *   ProductNetworkResult   —— 成品列表, 每个成品是一棵 BOM 树的根节点
 *   SupplyChainNode        —— 单个产品, 包含: 供应(谁生产)、需求(谁消耗)、库存、子树(消耗的物料)
 *   SupplySummary          —— 跨周期汇总的供应/需求/库存数据
 *   BomChild               —— BOM 子物料链接 (消耗因子 + 数量)
 * </pre>
 *
 * <h3>展开逻辑</h3>
 * <pre>
 *   1. 找到所有成品 (不被任何工序消耗的产品)
 *   2. 对每个成品, 构建 SupplyChainNode
 *   3. 对每个供应链节点, 查找消耗它的工序(向上 = 成品/半成品)
 *      和它消耗的物料(向下 = BOM子节点)
 *   4. 递归展开子节点直到原材料 (无 BOM 输入的工序产出, 或纯采购品)
 * </pre>
 */
public class ProductNetworkResult {

    /** 成品列表 (BOM 树的根节点) */
    private final List<SupplyChainNode> finishedGoods = new ArrayList<>();

    /** 所有节点的扁平索引 (按 nodeKey 查找, 用于去重) */
    private final java.util.Map<String, SupplyChainNode> allNodes = new java.util.LinkedHashMap<>();

    // ==================== Getters ====================

    public List<SupplyChainNode> getFinishedGoods() { return finishedGoods; }
    public java.util.Map<String, SupplyChainNode> getAllNodes() { return allNodes; }

    /** 获取或创建节点 (按 productId@spId 去重) */
    public SupplyChainNode getOrCreateNode(String productId, String spId) {
        String key = productId + "@" + spId;
        return allNodes.computeIfAbsent(key, k -> {
            SupplyChainNode node = new SupplyChainNode();
            node.setProductId(productId);
            node.setSpId(spId);
            return node;
        });
    }
}