package com.hxhq.business.utils;

import com.hxhq.common.core.exception.ServiceException;
import com.hxhq.common.core.utils.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 质量单位转换工具类（以pg为基础单位）
 */
public class WeightUnitTools {

    private static String[] unitList = {"pg", "ng", "ug", "mg", "g", "kg"};

    /**
     * 单位与皮克(pg)的换算关系（1单位 = 多少 pg）
     */
    private static final Map<String, BigDecimal> UNIT_TO_LITER = new HashMap<>();

    static {
        UNIT_TO_LITER.put("pg", new BigDecimal(1.0));                 // 皮克
        UNIT_TO_LITER.put("ng", new BigDecimal(1_000.0));              // 纳克 = 1000 pg
        UNIT_TO_LITER.put("ug", new BigDecimal(1_000_000.0));           // 微克 = 1,000,000 pg
        UNIT_TO_LITER.put("mg", new BigDecimal(1_000_000_000.0));       // 毫克 = 1,000,000,000 pg
        UNIT_TO_LITER.put("g", new BigDecimal(1_000_000_000_000.0));    // 克 = 1,000,000,000,000 pg
        UNIT_TO_LITER.put("kg", new BigDecimal(1_000_000_000_000.0));    // 千克 = 1,000,000,000,000,000 pg
    }

    /**
     * 体积相加
     * @param kc        当前库存
     * @param kcdw      当前库存单位
     * @param addKc     增加库存
     * @param addKcdw   增加库存单位
     * @return
     */
    public static  String addTj(String kc, String kcdw, String addKc, String addKcdw) {
        validateUnit(kcdw);
        validateUnit(addKcdw);
        BigDecimal kcValue = formatKc(kc);
        BigDecimal addKcValue = formatKc(addKc);
        addKcValue = convert(addKcValue, addKcdw, kcdw);
        kcValue = kcValue.add(addKcValue);

        return kcValue.toString();
    }

    /**
     * 体积相减
     * @param kc        当前库存
     * @param kcdw      当前库存单位
     * @param subKc     扣减库存
     * @param subKcdw   扣减库存单位
     * @return
     */
    public static  String subTj(String kc, String kcdw, String subKc, String subKcdw) {
        validateUnit(kcdw);
        validateUnit(subKcdw);
        BigDecimal kcValue = formatKc(kc);
        BigDecimal subKcValue = formatKc(subKc);
        subKcValue = convert(subKcValue, subKcdw, kcdw);
        kcValue = kcValue.subtract(subKcValue);

        DecimalFormat df = new DecimalFormat("#");

        return df.format(kcValue);
    }

    private static BigDecimal formatKc(String kc) {
        if(StringUtils.isEmpty(kc)) {
            return BigDecimal.ZERO;
        }
        if(!NumberUtils.isParsable(kc)) {
            throw new ServiceException("不支持的库存数量" + kc);
        }
        return new BigDecimal(kc);
    }

    /**
     * 体积单位换算
     * @param value 需要转换的数值
     * @param fromUnit 原始单位
     * @param toUnit 目标单位
     * @return 转换后的数值
     * @throws IllegalArgumentException 当单位不支持时抛出异常
     */
    public static BigDecimal convert(BigDecimal value, String fromUnit, String toUnit) {
        // 验证单位是否支持
        if (!UNIT_TO_LITER.containsKey(fromUnit) || !UNIT_TO_LITER.containsKey(toUnit)) {
            throw new IllegalArgumentException(
                    "不支持的单位。支持的单位有: " + String.join(", ", UNIT_TO_LITER.keySet())
            );
        }

        // 如果单位相同，直接返回
        if (fromUnit.equals(toUnit)) {
            return value;
        }

        // 转换为基准单位（pL）
        BigDecimal valueInLiters = value.multiply(UNIT_TO_LITER.get(fromUnit));

        // 从基准单位转换为目标单位
        return valueInLiters.divide(UNIT_TO_LITER.get(toUnit));
    }

    private static void validateUnit(String unit) {
        boolean isValid = false;
        for (String validUnit : unitList) {
            if (validUnit.equalsIgnoreCase(unit)) {
                isValid = true;
                break;
            }
        }
        if (!isValid) {
            throw new ServiceException("不支持的单位: " + unit +
                    "，支持的单位有: pg, ng, ug, mg, g, kg");
        }
    }


}
