package org.hzhub.erp.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 参数类型转换器
 *
 * @author HZHub Team
 */
public class ParamTypeConverter {

    private static final Logger log = LoggerFactory.getLogger(ParamTypeConverter.class);

    /**
     * 根据参数类型转换参数值
     *
     * @param paramType 参数类型（String/Integer/Long/Date/Boolean）
     * @param value 参数值
     * @return 转换后的值
     */
    public static Object convert(String paramType, Object value) {
        if (value == null) {
            return null;
        }

        try {
            switch (paramType.toUpperCase()) {
                case "STRING":
                    return value.toString();

                case "INTEGER":
                    if (value instanceof Number) {
                        return ((Number) value).intValue();
                    }
                    return Integer.parseInt(value.toString());

                case "LONG":
                    if (value instanceof Number) {
                        return ((Number) value).longValue();
                    }
                    return Long.parseLong(value.toString());

                case "DOUBLE":
                    if (value instanceof Number) {
                        return ((Number) value).doubleValue();
                    }
                    return Double.parseDouble(value.toString());

                case "DATE":
                    return parseDate(value.toString());

                case "DATETIME":
                    return parseDateTime(value.toString());

                case "BOOLEAN":
                    if (value instanceof Boolean) {
                        return value;
                    }
                    return Boolean.parseBoolean(value.toString());

                default:
                    log.warn("未知的参数类型: {}, 返回原值", paramType);
                    return value;
            }
        } catch (Exception e) {
            log.error("参数类型转换失败: paramType={}, value={}, error={}", paramType, value, e.getMessage());
            return value;
        }
    }

    /**
     * 解析日期（yyyy-MM-dd）
     *
     * @param dateStr 日期字符串
     * @return Date对象
     */
    private static Date parseDate(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.parse(dateStr);
    }

    /**
     * 解析日期时间（yyyy-MM-dd HH:mm:ss）
     *
     * @param dateTimeStr 日期时间字符串
     * @return LocalDateTime对象
     */
    private static LocalDateTime parseDateTime(String dateTimeStr) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return LocalDateTime.parse(dateTimeStr, formatter);
    }

    /**
     * 判断是否是有效的参数类型
     *
     * @param paramType 参数类型
     * @return 是否有效
     */
    public static boolean isValidType(String paramType) {
        if (paramType == null || paramType.trim().isEmpty()) {
            return false;
        }

        String upperType = paramType.toUpperCase();
        return upperType.equals("STRING")
            || upperType.equals("INTEGER")
            || upperType.equals("LONG")
            || upperType.equals("DOUBLE")
            || upperType.equals("DATE")
            || upperType.equals("DATETIME")
            || upperType.equals("BOOLEAN");
    }
}