package com.ruoyi.iot.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

import com.ruoyi.bst.bonus.domain.Bonus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.ServiceUtil;
import com.ruoyi.common.utils.collection.CollectionUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * 电池工具类
 * @author wjh
 * 2024/6/24
 */
@Slf4j
public class BatUtil {

    /**
     * 计算电量百分比
     * @param v 电压
     * @param maxV 满电电压
     * @param minV 亏电电压
     * @return 电压百分比
     */
    public static BigDecimal calcPowerPoint(BigDecimal v, BigDecimal maxV, BigDecimal minV) {
        if (v == null || maxV == null || minV == null) {
            return null;
        }
        BigDecimal decimal100 = new BigDecimal("100");

        // 计算电量百分比
        // point = (100 - ((maxV - v) * 100 / (maxV - minV)) )
        BigDecimal point = decimal100.subtract(
                    maxV.subtract(v).multiply(decimal100).divide(
                        maxV.subtract(minV),
                        2,
                        RoundingMode.HALF_UP
                    )
        );

        // 若小于0，则返回0
        if (point.compareTo(BigDecimal.ZERO) < 0) {
            return BigDecimal.ZERO;
        }
        // 若大于100，则返回100
        else if (point.compareTo(decimal100) > 0) {
            return decimal100;
        }
        // 否则，返回本身
        else {
            return point;
        }
    }


    /**
     * 计算电量电压
     * @param point 电量
     * @param maxV 满电电压
     * @param minV 亏电电压
     * @return 电压百分比
     */
    public static BigDecimal calcV(BigDecimal point, BigDecimal maxV, BigDecimal minV) {
        if (point == null || maxV == null || minV == null) {
            return null;
        }
        BigDecimal decimal100 = new BigDecimal("100");

        // 计算电量电压
        // v = maxV - ((1 - point / 100)) * (maxV - minV))
        BigDecimal v = maxV.subtract(
                BigDecimal.ONE.subtract(
                        point.divide(decimal100, 2, RoundingMode.HALF_UP)
                ).multiply(
                        maxV.subtract(minV)
                )
        );

        // 若小于0，则返回0
        if (v.compareTo(BigDecimal.ZERO) < 0) {
            return BigDecimal.ZERO;
        }
        // 否则，返回本身
        else {
            return v;
        }
    }

}
