package com.aps.macroplanner.output.dto;

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

/**
 * 供应链节点 — BOM 树中的一个节点, 表示某个产品在某个库存点的完整供需视图。
 *
 * <h3>节点类型 (level)</h3>
 * <pre>
 *   0 = 成品 (不被任何工序消耗)
 *   1 = 半成品 (被消耗, 同时也被生产)
 *   2+ = 原材料 (被消耗, 但不被本模型中的工序生产; 或纯采购品)
 * </pre>
 */
public class SupplyChainNode {

    // ==================== 基本信息 ====================

    /** 产品 ID */
    private String productId;
    /** 库存点 ID */
    private String spId;
    /** BOM 层级 (0=成品, N=第N层物料) */
    private int level;

    // ==================== 供应信息 (谁生产这个产品) ====================

    /** 供应来源: 工序生产、在途到货、还是纯外部采购 */
    private final List<SupplySource> supplySources = new ArrayList<>();

    // ==================== 需求信息 (谁消耗这个产品) ====================

    /** 外部销售需求汇总 */
    private double totalSalesDemand;
    /** 外部销售满足量汇总 */
    private double totalSalesFulfilled;
    /** BOM 依赖需求汇总 (被哪些产品/工序消耗) */
    private double totalDependentDemand;
    /** 消费者列表: 哪些产品消耗这个节点 */
    private final List<ConsumerInfo> consumers = new ArrayList<>();

    // ==================== 库存信息 (跨周期汇总) ====================

    /** 跨周期汇总: 供应/需求/库存 */
    private SupplySummary summary;

    // ==================== BOM 子节点 (这个产品消耗什么物料) ====================

    /** 直接子物料列表 (BOM 下一层) */
    private final List<BomChild> children = new ArrayList<>();

    // ==================== 内嵌类 ====================

    /** 供应来源 */
    public static class SupplySource {
        /** 来源类型: "OPERATION"(工序生产), "IN_TRANSIT"(在途), "EXTERNAL"(外部采购) */
        public String type;
        /** 工序 ID (type=OPERATION时有值) */
        public String operationId;
        /** 工序名称 */
        public String operationName;
        /** 设备 ID */
        public String unitId;
        /** 跨周期总产量 */
        public double totalProduction;
        /** 产能占用 */
        public double capacityUsed;
        /** 批量大小 (如有) */
        public Double lotSize;
    }

    /** 消费者信息 */
    public static class ConsumerInfo {
        /** 消耗本产品的产品 ID */
        public String consumerProductId;
        /** 消耗本产品的库存点 ID */
        public String consumerSpId;
        /** 消耗本产品的工序 ID */
        public String operationId;
        /** 消耗本产品的工序名称 */
        public String operationName;
        /** BOM 消耗因子 */
        public double factor;
        /** 跨周期总消耗量 */
        public double totalConsumed;
    }

    /** BOM 子物料 */
    public static class BomChild {
        /** 子物料产品 ID */
        public String productId;
        /** 子物料库存点 ID */
        public String spId;
        /** BOM 消耗因子 (每单位父产品消耗多少子物料) */
        public double totalFactor;
        /** 跨周期总消耗量 */
        public double totalConsumedQty;
    }

    // ==================== Getters / Setters ====================

    public String getProductId() { return productId; }
    public void setProductId(String v) { this.productId = v; }

    public String getSpId() { return spId; }
    public void setSpId(String v) { this.spId = v; }

    public int getLevel() { return level; }
    public void setLevel(int v) { this.level = v; }

    public List<SupplySource> getSupplySources() { return supplySources; }
    public List<ConsumerInfo> getConsumers() { return consumers; }

    public double getTotalSalesDemand() { return totalSalesDemand; }
    public void setTotalSalesDemand(double v) { this.totalSalesDemand = v; }

    public double getTotalSalesFulfilled() { return totalSalesFulfilled; }
    public void setTotalSalesFulfilled(double v) { this.totalSalesFulfilled = v; }

    public double getTotalDependentDemand() { return totalDependentDemand; }
    public void setTotalDependentDemand(double v) { this.totalDependentDemand = v; }

    public SupplySummary getSummary() { return summary; }
    public void setSummary(SupplySummary v) { this.summary = v; }

    public List<BomChild> getChildren() { return children; }

    /** BOM 子节点数量 */
    public int childCount() { return children.size(); }
}