package org.kne.cloud.network.monitor;

import java.util.function.Supplier;

public class CostSupplierFactory {
	/**
	 * 从 DelayMonitorData 获取 OWD 作为成本
	 * 
	 * @param monitor 延迟监控数据
	 * @return 返回 OWD 的 Supplier
	 */
	public static Supplier<Long> owdSupplier(DelayMonitorData monitor) {
		return () -> monitor.getOutDelay();
	}

	/**
	 * 静态成本 Supplier（用于测试或静态路由）
	 * 
	 * @param cost 固定的成本值
	 * @return 返回固定值的 Supplier
	 */
	public static Supplier<Long> staticSupplier(long cost) {
		return () -> cost;
	}
	/**
     * 使用你设计的“概率期望延迟”公式：OWD + RTO × (1 - Reliability)
     * @param monitor 延迟监控数据（提供 OWD）
     * @param linkStatus 链路状态（提供 Reliability）
     * @param rtoNanos 超时重传时间（纳秒）
     * @return 返回期望延迟的 Supplier
     */
	public static Supplier<Long> expectedDelaySupplier(DelayMonitorData monitor, LinkStatus linkStatus, Supplier<Long> rtoNanos) {
		return () -> {
			long owd = monitor.getOutDelay();
			double reliability = linkStatus.getReliability();
// 期望延迟 = OWD + RTO × (1 - Reliability)
			long exp=(long) (owd + rtoNanos.get() * (1 - reliability));
			//System.out.println("OWD:"+owd+" EXP:"+exp);
			return exp;
		};
	}

	/**
	 * 组合两个 Supplier，取最大值（可用于 ECMP 场景下的保守调度）
	 */
	public static Supplier<Long> maxSupplier(Supplier<Long> a, Supplier<Long> b) {
		return () -> Math.max(a.get(), b.get());
	}

	/**
	 * 组合两个 Supplier，取最小值（可用于 ECMP 场景下的乐观调度）
	 */
	public static Supplier<Long> minSupplier(Supplier<Long> a, Supplier<Long> b) {
		return () -> Math.min(a.get(), b.get());
	}
}
