package com.usky.vpp.util;

import com.usky.vpp.domain.VppDrParticipation;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 需求响应参与记录工具
 */
public final class VppDrParticipationHelper {

    private static final int RATE_SCALE = 4;

    private VppDrParticipationHelper() {
    }

    /**
     * 完成率 = 出清容量 / 申报出清容量；申报出清容量为空或 ≤0、出清容量为空时返回 null。
     */
    public static BigDecimal calcCompletionRate(BigDecimal clearedCapacityKw, BigDecimal declaredCapacityKw) {
        if (clearedCapacityKw == null || declaredCapacityKw == null
                || declaredCapacityKw.compareTo(BigDecimal.ZERO) <= 0) {
            return null;
        }
        return clearedCapacityKw.divide(declaredCapacityKw, RATE_SCALE, RoundingMode.HALF_UP);
    }

    /**
     * 响应完成率 = 实际响应容量 / 实际出清；分母为空或 ≤0、实际响应容量为空时返回 null。
     */
    public static BigDecimal calcResponseCompletionRate(BigDecimal actualResponseCapacityKw,
                                                        BigDecimal actualClearedCapacityKw) {
        return divideRate(actualResponseCapacityKw, actualClearedCapacityKw);
    }

    /**
     * 预估完成率 = 预估响应容量 / 实际出清；分母为空或 ≤0、预估响应容量为空时返回 null。
     */
    public static BigDecimal calcEstimatedCompletionRate(BigDecimal estimatedResponseCapacityKw,
                                                         BigDecimal actualClearedCapacityKw) {
        return divideRate(estimatedResponseCapacityKw, actualClearedCapacityKw);
    }

    private static BigDecimal divideRate(BigDecimal numerator, BigDecimal denominator) {
        if (numerator == null || denominator == null
                || denominator.compareTo(BigDecimal.ZERO) <= 0) {
            return null;
        }
        return numerator.divide(denominator, RATE_SCALE, RoundingMode.HALF_UP);
    }

    public static void refreshCompletionRate(VppDrParticipation participation) {
        if (participation == null) {
            return;
        }
        participation.setCompletionRate(calcCompletionRate(
                participation.getClearedCapacityKw(),
                participation.getDeclaredCapacityKw()));
    }
}
