package com.scm.contract.tools;

import com.set.direwolf.core.entity.User;
import com.set.direwolf.core.utils.UserUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

/**
 * @author zuo
 * @date 2024/6/7 15:53
 */

public class Tools {

    public static User getUser() {
        User currentUser = UserUtils.getUser();
        if (Objects.isNull(currentUser)) {
            User user = new User();
            user.setId("999999999");
            user.setNickName("未知");
            currentUser = user;
        }
        return currentUser;
    }

    /**
     * 获取最小包装单元list
     *
     * @return
     */
    public static List<Integer> getPackagingUnits() {
        List<Integer> integers = new ArrayList<>();
        integers.add(1);
        integers.add(5);
        integers.add(10);
        integers.add(100);
        integers.add(1000);
        return integers;
    }

    /**
     * @param value 需要科学计算的数据
     * @param digit 保留的小数位
     * @return 功能：四舍六入五成双计算法
     */
    public static Double digitHalfEven(Double value, int digit) {
        if (Objects.isNull(value)) return null;
        return new BigDecimal(value).setScale(digit, RoundingMode.HALF_EVEN).doubleValue();
    }

    public static <T> List<T> convertList(List<Object> dataList, Class<T> aClass) {
        List<T> convertedList = new ArrayList<>();
        for (Object obj : dataList) {
            if (aClass.isInstance(obj)) {
                convertedList.add((T) obj);
            }
        }
        return convertedList;
    }

    // 模16加权因子
//    private static final int[] WEIGHTS = {1, 1, 0, 1, 3, 3, 0, 1, 3, 3, 0, 1, 3, 3, 5, 1};

    /**
     * 计算EPC（Electronic Product Code）的模16校验码
     *
     * @param epc 不含校验码的EPC码
     * @return 计算出的校验码
     */
    public static String calculateCheckDigit(String epc) {
        int sum = 0;
        for (int i = 0; i < epc.length(); i++) {
            char digit = epc.charAt(i);
            if (digit >= '0' && digit <= '9') {
                sum += (digit - '0');
            } else {
                // 如果EPC包含非数字字符，则不计算它们
                return "0";
            }
        }
        int checkDigit = (16 - sum % 16) % 16; // 模16算法
        return Integer.toHexString(checkDigit).toUpperCase();
    }

//    public static void main(String[] args) {
//        System.out.println(calculateCheckDigit("10100020483100098540811120241000003"));
//    }

    /**
     * 10进制转16进制并根据要求位数前面补0（超过要求位数按实际来）
     * @param decimal 10进制数据
     * @param digit 转成16进制后要的位数
     * @return 返回补足好位数的16进制
     */
    public static String decimalToHex(Long decimal, Integer digit) {
        String hex = String.format("%" + digit + "s", Long.toHexString(decimal)).replace(' ', '0').toUpperCase(Locale.ENGLISH);
//        System.out.println("十进制数 " + decimal + " 的十六进制表示是 " + hex);
        return hex;
    }

    public static <T> List<T> castList(Object obj, Class<T> clazz){
        List<T> result = new ArrayList<>();
        if(obj instanceof List<?>){
            for (Object o : (List<?>) obj){
                result.add(clazz.cast(o));
            }
            return result;
        }
        return new ArrayList<>();
    }

}
