package org.xyzh.common.utils;

/**
 * @description    StringUtils.java文件描述 字符串工具类
 * @filename    StringUtils.java
 * @author    yslg
 * @copyright xyzh
 * @since 2025-09-07
 */
public class StringUtils {
    /**
     * @description    字符串是否为空
     * @param  str String    字符串
     * @return    是否为空
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * @description    字符串是否不为空
     * @param  str String    字符串
     * @return    是否不为空
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    public static String format(String template, Object... args) {
        if (template == null || args == null) return template;
        return String.format(template, args);
    }

    /**
     * @description    去除字符串首尾空格
     * @param  str String    字符串
     * @return    去除空格后的字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }

    /**
     * @description    判断两个字符串是否相等（支持null）
     * @param  a String    字符串A
     * @param  b String    字符串B
     * @return    是否相等
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean equals(String a, String b) {
        return a == null ? b == null : a.equals(b);
    }

    /**
     * @description    判断字符串是否包含子串
     * @param  str String    原字符串
     * @param  sub String    子串
     * @return    是否包含
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean contains(String str, String sub) {
        return str != null && sub != null && str.contains(sub);
    }

    /**
     * @description    字符串拼接（用分隔符）
     * @param  delimiter String    分隔符
     * @param  elements String[]   待拼接字符串数组
     * @return    拼接后的字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String join(String delimiter, String... elements) {
        if (elements == null) return null;
        return String.join(delimiter, elements);
    }

    /**
     * @description    字符串分割
     * @param  str String    原字符串
     * @param  regex String  分割正则表达式
     * @return    分割后的字符串数组
     * @author    yslg
     * @since 2025-09-07
     */
    public static String[] split(String str, String regex) {
        return str == null ? null : str.split(regex);
    }

    /**
     * @description    字符串替换
     * @param  str String    原字符串
     * @param  target String 替换目标
     * @param  replacement String 替换内容
     * @return    替换后的字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String replace(String str, String target, String replacement) {
        return str == null ? null : str.replace(target, replacement);
    }

    /**
     * @description    是否以指定前缀开头
     * @param  str String    原字符串
     * @param  prefix String 前缀
     * @return    是否以前缀开头
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean startsWith(String str, String prefix) {
        return str != null && prefix != null && str.startsWith(prefix);
    }

    /**
     * @description    是否以指定后缀结尾
     * @param  str String    原字符串
     * @param  suffix String 后缀
     * @return    是否以后缀结尾
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean endsWith(String str, String suffix) {
        return str != null && suffix != null && str.endsWith(suffix);
    }

    /**
     * @description    转为大写
     * @param  str String    原字符串
     * @return    大写字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String toUpperCase(String str) {
        return str == null ? null : str.toUpperCase();
    }

    /**
     * @description    转为小写
     * @param  str String    原字符串
     * @return    小写字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String toLowerCase(String str) {
        return str == null ? null : str.toLowerCase();
    }

    /**
     * @description    反转字符串
     * @param  str String    原字符串
     * @return    反转后的字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String reverse(String str) {
        if (str == null) return null;
        return new StringBuilder(str).reverse().toString();
    }

    /**
     * @description    重复字符串n次
     * @param  str String    原字符串
     * @param  n int         重复次数
     * @return    重复后的字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String repeat(String str, int n) {
        if (str == null || n <= 0) return "";
        return str.repeat(n);
    }

    /**
     * @description    截取字符串
     * @param  str String    原字符串
     * @param  beginIndex int 起始索引
     * @param  endIndex int   结束索引
     * @return    截取后的字符串
     * @author    yslg
     * @since 2025-09-07
     */
    public static String substring(String str, int beginIndex, int endIndex) {
        if (str == null) return null;
        if (beginIndex < 0) beginIndex = 0;
        if (endIndex > str.length()) endIndex = str.length();
        if (beginIndex > endIndex) return "";
        return str.substring(beginIndex, endIndex);
    }

    /**
     * @description    判断字符串是否为数字
     * @param  str String    原字符串
     * @return    是否为数字
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean isNumeric(String str) {
        if (isEmpty(str)) return false;
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) return false;
        }
        return true;
    }
    
    /**
     * @description    字符串是否为空白
     * @param  str String    原字符串
     * @return    是否为空白
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean isBlank(String str) {
        return str == null || str.isBlank();
    }
    /**
     * @description    字符串是否不为空白
     * @param  str String    原字符串
     * @return    是否不为空白
     * @author    yslg
     * @since 2025-09-07
     */
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

}
