package com.huatek.busi.util;


import cn.hutool.core.date.DateUtil;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 避雷器评测计算公式
 */
public class ArresterCal {


    /**
     * 计算健康指数
     */
    public static final BigDecimal β  = new BigDecimal(0.98);

    /**
     * 避雷器设计运行年限（年）
     */
    public static final double T  = 3650;

    /**
     * 避雷器退役时的健康指数
     */
    public static final double Hiend = 0.35;

    /**
     * 避雷器初始运行的健康指数
     */
    public static final double Hi0 = 0.988;

    /**
     * 避雷器未来故障算法
     * 公式：f(x)=1-exp(-(x/w)^b)
     * x = 避雷器（绝缘电阻/泄漏电流/阻性电流、容性电流/雷击次数/环境温度，绝缘)最终计算健康指数
     * w = 变压器投运后一个月，开始计算的，到今天的运行时间（小时）
     * b = b修正系数=0.98
     */
    public static BigDecimal calFutureFailureRate(BigDecimal x,BigDecimal β,BigDecimal w){
        double step = Math.pow((x.doubleValue()/w.doubleValue()),β.doubleValue());
         return  new BigDecimal(1 - Math.exp(-step));
    }

    /**
     * 计算w
     * @param startTime
     * @return
     */
    public static  BigDecimal calW(Date startTime){
        BigDecimal w =BigDecimal.ZERO;
        Date nowTime = new Date();
        double time = (nowTime.getTime() - startTime.getTime()) / (1000 * 3600 * 24);
        if(time > 30) {
            w =new  BigDecimal((time - 30) * 24) ;
        }
        return w;
    }
    /**
     * 按照升序计算权重
     * 升序公式：0≦ x ＜a y(x)=0 a≦ x ＜b y(x)=(x-a)/(b-a) b≦x y(x)=1
     * @param a 阈值
     * @param b 阈值
     * @param x 实际值
     * @param weight 权重
     * @param isAttend 是否参与评测：0:不参与  1：参与
     * @return
     */
    public static  BigDecimal clacFormulaAsc(double a, double b, double x, double weight, String isAttend) {
        if(0==x){
            return BigDecimal.ZERO;
        }
        if (isAttend.equals("0")) {
            return BigDecimal.ZERO;
        }
        if (weight == 0d) {
            return  BigDecimal.ZERO;
        }

        double value = 1d;
        if (x >= 0d && x < a) {
            value = 0d;
        } else if (x >= a && x < b) {
            value = (x - a) / (b - a);
        } else if (x >= b) {
            value = 1d;
        }
        double d = value * weight;
        return new BigDecimal(d).setScale(4, RoundingMode.HALF_UP);
    }

    /**
     * 按照降序计算权重
     * 降序公式：0≦ x ＜a y(x)=1 a≦ x ＜b y(x)=(b-x)/(b-a) b≦x y(x)=0
     * @param a 阈值
     * @param b 阈值
     * @param x 实际值
     * @param weight 权重
     * @param isAttend 是否参与评测：0:不参与  1：参与
     * @return Double
     */
    public static BigDecimal clacFormulaDesc(double a, double b, double x, double weight, String isAttend) {
        if(0==x){
            return BigDecimal.ZERO;
        }
        if (isAttend.equals("0")) {
            return BigDecimal.ZERO;
        }
        if (weight == 0d) {
            return BigDecimal.ZERO;
        }

        double value = 1d;
        if (x >= 0d && x < a) {
            value = 1d;
        } else if (x >= a && x < b) {
            value = (b - x) / (b - a);
        } else if (x >= b) {
            value = 0d;
        }
        double d = value * weight;
        return new BigDecimal(d).setScale(4, RoundingMode.HALF_UP);
    }

    /**
     * B0计算
     * @return
     */
    public static double calB0(){
       return (Math.log(1 - Hiend) - Math.log(1 - Hi0)) / T;
    }

    /**
     * Hi1
     * @param date 安装日期
     * @param date 安装日期
     * @return
     */
    public  static  BigDecimal calHi1(Date date,Integer num){
        Date nowTime = new Date();
        //毫秒差
        long diff=0 ;
        long time1 = date.getTime();
        long time2 = nowTime.getTime();
        //天数差
        long day = 0;
        diff = time2 - time1;
        day = diff / (24 * 60 * 60 * 1000);
        double v1 = calB0() * day;
        double v = 1-(1 - Hi0) * (Math.pow(Math.E,v1 ));
        double p=1;
       if(num >0 && num<=10){
           p=0.98;
       }
       if(num >10 && num <=20){
           p=0.95;
       }
        if(num >20 && num <=40){
            p=0.9;
        }
        if(num >40){
            p=0.85;
        }
        return new BigDecimal(v*p).setScale(4, RoundingMode.HALF_UP) ;
    }

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd");
        Date date =  formatter.parse("2022-10-12");
        System.out.println("Hi1 = " + calHi1(date,1));
    }
}
