package com.cf.imes.module.executor.util.fileConversion.admin;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数据转换工具类
 */
public class ToolUtil {

    // 手机号验证
    public static Boolean validatePhoneNumber(String phoneNumber) {
        // 定义手机号正则表达式
        String regex = "^1[3-9]\\d{9}$";

        // 编译正则表达式
        Pattern pattern = Pattern.compile(regex);

        // 创建 Matcher 对象
        Matcher matcher = pattern.matcher(phoneNumber);

        // 判断手机号是否匹配正则表达式
        if (!matcher.matches()) {
            return false;
        }
        return true;
    }

    // 日期格式转换
    public static Map<String, Object> changeDate(String date, DateTimeFormatter formatter) {
        String errorKey = "error";
        String dateKey = "date";
        Map<String, Object> map = new HashMap<>();
        LocalDate localDate;
        if (date == null){
            localDate = LocalDate.now();
            map.put(dateKey, localDate);
            map.put(errorKey, 0);
        }else {
            try {
                localDate = LocalDate.parse(date, formatter);
                map.put(dateKey, localDate);
                map.put(errorKey, 1);
            } catch (DateTimeParseException e) {
                map.put(dateKey, date);
                map.put(errorKey, -1);

            }
        }
        return map;
    }

    // 数据类型转换
    public static Boolean convertToType(String str, Class<?> targetType) {
        try {
            Method method;
            if (targetType.getSimpleName().equals("Integer")) {
                method = targetType.getMethod("parseInt", String.class);
            } else {
                method = targetType.getMethod("parse" + targetType.getSimpleName(), String.class);
            }
            method.invoke(null, str);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    // 数值正负判断
    public static Boolean checkNumber(String numberStr) {
        try {
            double number = Double.parseDouble(numberStr);
            // 进行正负判断
            if (number >= 0) {
                return true;
            } else {
                return false;
            }
        } catch (NumberFormatException e) {
            return false;
        }
    }

    // 数据长度判断
    public static boolean checkPrecision(String numberStr, Integer length, Integer decimalLength) {
        if (numberStr == null) {
            return false;
        }

        // 分割整数部分和小数部分
        String[] parts = numberStr.split("\\.");
        String integerPart = parts[0];
        String decimalPart = parts.length > 1 ? parts[1] : "";

        // 检查整数部分位数
        if (integerPart.length() > length) {
            return false;
        }

        // 检查小数部分位数
        if (decimalPart.length() > decimalLength) {
            return false;
        }
        return true;
    }

    // 判断对象是否全为空或是null，进行去除
    /**
     * 检查给定的对象的所有字段是否为空或 null。
     * @param obj 要检查的对象。
     * @return 如果所有字段都是空或 null，则返回 true；否则返回 false。
     */
    public static boolean isAllFieldsEmptyOrNull(Object obj) {
        if (obj == null) return true;

        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            try {
                Object value = field.get(obj);
                if (value != null && !(value instanceof String && ((String)value).trim().isEmpty())) {
                    return false;
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
        return true;
    }
}
