package com.yd.csf.service.helper;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;

/**
 * 规格条件匹配器
 */
public class SpeciesConditionMatcher {

    /**
     * 判断条件是否匹配
     * @param typeCode 条件类型代码
     * @param conditionValue 配置的条件值
     * @param actualValue 实际值
     * @return true-匹配，false-不匹配
     */
    public static boolean matches(String typeCode, String conditionValue, Object actualValue) {
        if (StringUtils.isBlank(conditionValue) || actualValue == null) {
            return false;
        }

        String actualValueStr = String.valueOf(actualValue);

        // 范围匹配类型
        if ("AGE".equals(typeCode) || "PREMIUM".equals(typeCode)) {
            return matchesRange(conditionValue, actualValue);
        }

        // 精确匹配类型（包括专业投资者，不区分大小写）
        if ("PROFESSIONAL".equals(typeCode)) {
            return conditionValue.equalsIgnoreCase(actualValueStr);
        }

        // 其他类型精确匹配
        return conditionValue.equals(actualValueStr);
    }

    /**
     * 范围匹配
     * 支持格式：
     * - "0-10" 表示 (0, 10] 左开右闭区间
     * - "10-" 表示 > 10
     * - "-10" 表示 <= 10
     * - "10" 表示等于 10
     * - "0-64岁" 表示 (0, 64] 左开右闭区间
     */
    private static boolean matchesRange(String conditionValue, Object actualValue) {
        try {
            BigDecimal actual = toBigDecimal(actualValue);

            // 解析范围表达式
            String expression = conditionValue.replace("岁", "").trim();

            if (!expression.contains("-")) {
                // 单个值 "10"
                BigDecimal value = new BigDecimal(expression);
                return actual.compareTo(value) == 0;
            }

            String[] parts = expression.split("-", -1);
            if (parts.length != 2) {
                return false;
            }

            String left = parts[0].trim();
            String right = parts[1].trim();

            if (left.isEmpty() && right.isEmpty()) {
                // "-" 无效
                return false;
            } else if (left.isEmpty()) {
                // "-10" 表示 <= 10
                BigDecimal max = new BigDecimal(right);
                return actual.compareTo(max) <= 0;
            } else if (right.isEmpty()) {
                // "10-" 表示 > 10
                BigDecimal min = new BigDecimal(left);
                return actual.compareTo(min) > 0;
            } else {
                // "0-10" 表示 (0, 10]
                BigDecimal min = new BigDecimal(left);
                BigDecimal max = new BigDecimal(right);
                return actual.compareTo(min) > 0 && actual.compareTo(max) <= 0;
            }
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 将对象转换为 BigDecimal
     */
    private static BigDecimal toBigDecimal(Object value) {
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        if (value instanceof Number) {
            return new BigDecimal(value.toString());
        }
        // 处理 "0-64岁" 格式，提取第一个数字
        String str = String.valueOf(value).replace("岁", "").trim();
        if (str.contains("-")) {
            str = str.split("-")[0];
        }
        return new BigDecimal(str);
    }

    /**
     * 获取条件名称
     */
    public static String getConditionName(String typeCode) {
        switch (typeCode) {
            case "PAYMENT_TERM":
                return "供款年期";
            case "RECONCILIATION_COMPANY":
                return "出单经纪公司";
            case "AGE":
                return "投保年龄";
            case "PREMIUM":
                return "期缴保费";
            case "PROFESSIONAL_INVESTOR":
                return "专业投资者";
            case "POLICY_CURRENCY":
                return "保单币种";
            case "GUARANTEE_PERIOD":
                return "保障年期";
            default:
                return typeCode;
        }
    }
}
