package com.ho.business.util.custom;

import java.math.BigDecimal;

/**
 * 获取功率
 */
public class PowerUitl {

    /**
     * 充电策略获取有功功率
     * @param soc
     * @param pMax 满载功率
     * @param qMax 安全电量上限
     * @return
     */
    public static BigDecimal getChargePower(BigDecimal soc,BigDecimal pMax,BigDecimal qMax){
        if(soc.add(pMax).compareTo(qMax)<=0){
            return pMax;
        }else{
            return qMax.subtract(soc);
        }
    }

    /**
     * 放电策略获取有功功率
     * @param soc
     * @param pMax 满载功率
     * @param qMin 安全用电下限
     * @param pt 对应时段昨日用电量
     * @return
     */
    public static BigDecimal getDischargePower(BigDecimal soc,BigDecimal pMax,BigDecimal qMin,BigDecimal pt){
        if(soc.subtract(pMax).compareTo(qMin)>=0){
            return pMax.compareTo(pt)>=0?pt:pMax;
        }else{
            return soc.subtract(qMin);
        }
    }

    /**
     * 谷段策略
     * @param soc
     * @param pMax 满载功率
     * @param qMax 安全电量上限
     * @return
     */
    public static BigDecimal getValleyPower(BigDecimal soc,BigDecimal pMax,BigDecimal qMax){
        if(soc.compareTo(qMax)>0){
            return BigDecimal.ZERO;
        }else{
            return getChargePower(soc,pMax,qMax);
        }
    }

    /**
     * 尖段策略
     * @param soc
     * @param pMax 满载功率
     * @param qMin 安全电量下限
     * @param pt 对应时段昨日用电量
     * @return
     */
    public static BigDecimal getSharpPower(BigDecimal soc,BigDecimal pMax,BigDecimal qMin,BigDecimal pt){
        if(soc.compareTo(qMin)<=0){
            return BigDecimal.ZERO;
        }else{
            return getDischargePower(soc,pMax,qMin,pt);
        }
    }

    /**
     * 判断是执行放电策略或者待机
     * @param soc
     * @param pMax 满载功率
     * @param qMin 安全电量下限
     * @param pt 对应时段昨日用电量
     * @param total 下一阶段总耗电数
     * @return
     */
    public static BigDecimal getDischargeStopPower(BigDecimal soc, BigDecimal pMax, BigDecimal qMin, BigDecimal pt, BigDecimal total){
        if(soc.subtract(total).compareTo(qMin)>=0){
            return getDischargePower(soc, pMax, qMin, pt);
        }else{
            return BigDecimal.ZERO;
        }
    }
}
