package com.aps.macroplanner.model;

import com.aps.macroplanner.data.TestDataBuilder;
import com.aps.macroplanner.variable.*;

/**
 * 变量工厂 — 编排器，按构建顺序调度各变量构建器。
 *
 * <p>设计原则: 与 {@link com.aps.macroplanner.constraint.ConstraintFactory} 保持对称,
 * 每个变量类别由独立的 Builder 类负责, 本类仅负责编排调度。</p>
 *
 * <h3>构建顺序</h3>
 * <pre>
 * 1. 生产变量          → ProductionVariableBuilder
 * 2. 库存变量          → InventoryVariableBuilder
 * 3. 需求变量          → DemandVariableBuilder
 * 4. 产能松弛变量      → CapacityVariableBuilder
 * 5. 库存松弛变量      → InventorySlackVariableBuilder
 * 6. 供应松弛变量      → SupplySlackVariableBuilder
 * 7. 批次松弛变量      → LotSizeVariableBuilder
 * 8. BOM 依赖需求变量  → BomVariableBuilder
 * 9. 需求满足量变量    → DemandFulfillmentVariableBuilder
 * </pre>
 *
 * <h3>扩展方式</h3>
 * 新增变量类型时:
 * <ol>
 *   <li>在 {@code com.aps.macroplanner.variable} 包创建新的 Builder 类</li>
 *   <li>在 {@link MacroPlannerModel} 添加对应的变量 Map</li>
 *   <li>在本类的 {@link #createAll} 方法中注册调用</li>
 * </ol>
 */
public class VariableFactory {

    /**
     * 创建所有决策变量并注册到模型。
     *
     * @param model 模型容器 (通过 getter 获取 Map 引用, 直接 put 变量)
     * @param data  测试数据 (提供索引维度)
     */
    public static void createAll(MacroPlannerModel model, TestDataBuilder data) {
        ProductionVariableBuilder.create(model, data);
        InventoryVariableBuilder.create(model, data);
        DemandVariableBuilder.create(model, data);
        CapacityVariableBuilder.create(model, data);
        InventorySlackVariableBuilder.create(model, data);
        SupplySlackVariableBuilder.create(model, data);
        LotSizeVariableBuilder.create(model, data);
        BomVariableBuilder.create(model, data);
        DemandFulfillmentVariableBuilder.create(model, data);
    }
}