package com.ruoyi.rocketmq.utils;

import org.apache.commons.lang3.StringUtils;

/**
 * 数据库字段名转换工具类
 */
public class FieldNameConverterUtil {

    /**
     * 将数据库字段名转换为Java属性名（带Collect后缀）
     * 示例：system.swap.size.free -> systemSwapSizeFreeCollect
     *
     * @param dbFieldName 数据库字段名
     * @return Java属性名
     */
    public static String convertToJavaProperty(String dbFieldName) {
        return convertToJavaProperty(dbFieldName, "Collect");
    }

    /**
     * 将数据库字段名转换为Java属性名（自定义后缀）
     * 示例：system.swap.size.free + "Config" -> systemSwapSizeFreeConfig
     *
     * @param dbFieldName 数据库字段名
     * @param suffix 自定义后缀
     * @return Java属性名
     */
    public static String convertToJavaProperty(String dbFieldName, String suffix) {
        if (StringUtils.isBlank(dbFieldName)) {
            return "";
        }

        // 分割字段名
        String[] parts = dbFieldName.split("\\.");

        // 处理每个部分
        StringBuilder result = new StringBuilder(parts[0]);
        for (int i = 1; i < parts.length; i++) {
            result.append(StringUtils.capitalize(parts[i]));
        }

        // 添加后缀
        if (StringUtils.isNotBlank(suffix)) {
            result.append(suffix);
        }

        return result.toString();
    }

    /**
     * 将SNMP字段名转换为Java属性名（带指定前缀和Collect后缀）
     * 示例：sysDescr -> switchSysDescrCollect
     *        ifHCInOctets -> switchIfHCInOctetsCollect
     *
     * @param snmpFieldName SNMP字段名
     * @param prefix 前缀（如：switch、router等）
     * @return Java属性名
     */
    public static String convertSnmpToJavaProperty(String snmpFieldName, String prefix) {
        return convertSnmpToJavaProperty(snmpFieldName, prefix, "Collect");
    }

    /**
     * 将SNMP字段名转换为Java属性名（带指定前缀和自定义后缀）
     * 示例：sysDescr + "switch" + "Config" -> switchSysDescrConfig
     *        ifHCInOctets + "router" + "Info" -> routerIfHCInOctetsInfo
     *
     * @param snmpFieldName SNMP字段名
     * @param prefix 前缀（如：switch、router等）
     * @param suffix 自定义后缀
     * @return Java属性名
     */
    public static String convertSnmpToJavaProperty(String snmpFieldName, String prefix, String suffix) {
        if (StringUtils.isBlank(snmpFieldName)) {
            return "";
        }

        StringBuilder result = new StringBuilder();

        // 添加前缀
        if (StringUtils.isNotBlank(prefix)) {
            result.append(prefix);
        }

        // 处理SNMP字段名（将首字母大写）
        result.append(StringUtils.capitalize(snmpFieldName));

        // 添加后缀
        if (StringUtils.isNotBlank(suffix)) {
            result.append(suffix);
        }

        return result.toString();
    }

    /**
     * 将SNMP字段名转换为交换机Java属性名（带switch前缀和Collect后缀）
     * 示例：sysDescr -> switchSysDescrCollect
     *        ifHCInOctets -> switchIfHCInOctetsCollect
     *
     * @param snmpFieldName SNMP字段名
     * @return Java属性名
     */
    public static String convertToSwitchProperty(String snmpFieldName) {
        return convertSnmpToJavaProperty(snmpFieldName, "switch", "Collect");
    }

    /**
     * 将Java属性名转换回数据库字段名
     * 示例：systemSwapSizeFreeCollect -> system.swap.size.free
     *
     * @param javaProperty Java属性名
     * @param suffix 需要去除的后缀
     * @return 数据库字段名
     */
    public static String convertToDbField(String javaProperty, String suffix) {
        if (StringUtils.isBlank(javaProperty)) {
            return "";
        }

        // 去除后缀
        String withoutSuffix = StringUtils.isNotBlank(suffix)
                ? StringUtils.removeEnd(javaProperty, suffix)
                : javaProperty;

        // 使用正则表达式在大小写字母之间插入点号
        return withoutSuffix.replaceAll("(?<=[a-z])(?=[A-Z])", ".")
                .toLowerCase();
    }

    /**
     * 将带前缀和后缀的Java属性名转换回原始SNMP字段名
     * 示例：switchSysDescrCollect -> sysDescr
     *        routerIfHCInOctetsInfo -> ifHCInOctets
     *
     * @param javaProperty Java属性名
     * @param prefix 需要去除的前缀
     * @param suffix 需要去除的后缀
     * @return 原始SNMP字段名
     */
    public static String convertToSnmpField(String javaProperty, String prefix, String suffix) {
        if (StringUtils.isBlank(javaProperty)) {
            return "";
        }

        // 去除后缀
        String withoutSuffix = StringUtils.isNotBlank(suffix)
                ? StringUtils.removeEnd(javaProperty, suffix)
                : javaProperty;

        // 去除前缀
        String withoutPrefix = StringUtils.isNotBlank(prefix)
                ? StringUtils.removeStart(withoutSuffix, StringUtils.capitalize(prefix))
                : withoutSuffix;

        // 将首字母转为小写
        if (StringUtils.isNotBlank(withoutPrefix)) {
            return StringUtils.uncapitalize(withoutPrefix);
        }

        return withoutPrefix;
    }

    /**
     * 将交换机Java属性名转换回原始SNMP字段名
     * 示例：switchSysDescrCollect -> sysDescr
     *        switchIfHCInOctetsCollect -> ifHCInOctets
     *
     * @param switchProperty 交换机Java属性名
     * @return 原始SNMP字段名
     */
    public static String convertFromSwitchProperty(String switchProperty) {
        return convertToSnmpField(switchProperty, "switch", "Collect");
    }
}