package com.aps.macroplanner;

import com.google.ortools.Loader;
import com.aps.macroplanner.data.CoProductTestDataBuilder;
import com.aps.macroplanner.data.TestDataBuilder;

/**
 * 联产品/副产品多工序路由测试运行器。
 *
 * <p>验证场景: 化工反应 2 步工艺路线, 反应工序同时产出主产品 P 和副产品 ByP,
 * 验证:
 * <ol>
 *   <li>OP_Reaction 有 2 个产出: P@WIP_R_P_1 + ByP@SP_ByProduct</li>
 *   <li>RoutingConstraint 确保 PTQty[Reaction] = PTQty[Purify]</li>
 *   <li>ByP 产量 = PTQty[Reaction], 与主产品 P 同步</li>
 *   <li>P@SP_FG 物料平衡: 流入 = 流出</li>
 *   <li>ByP@SP_ByProduct 物料平衡: 联产品流入 = 销售 + 库存</li>
 *   <li>P@WIP_R_P_1 物料平衡: 流入 = 消耗</li>
 * </ol>
 */
public class CoProductTestRunner {
    public static void main(String[] args) {
        Loader.loadNativeLibraries();

        System.out.println("===== 联产品/副产品 多工序路由测试 =====\n");
        System.out.println("场景: 化工反应 2 步工艺路线");
        System.out.println("  工序1: OP_Reaction(反应) → 产出 P@WIP + ByP@SP_ByProduct(联产品)");
        System.out.println("  工序2: OP_Purify(提纯)  → 消耗 P@WIP, 产出 P@SP_FG");
        System.out.println("  销售: P@SP_FG=50/天, ByP@SP_ByProduct=30/天\n");

        TestDataBuilder data = new CoProductTestDataBuilder();
        System.out.println("数据加载: " + data.getProducts().size() + " 产品, "
                + data.getOperations().size() + " 工序, "
                + data.getRoutings().size() + " 工艺路线\n");

        MacroPlannerOptimizer optimizer = new MacroPlannerOptimizer(data);
        optimizer.buildModel();
        optimizer.solve();

        System.out.println("\n===== 联产品/副产品 多工序路由测试 结束 =====");
    }
}