package com.hzs.common.core.utils;

/**
 * 数据脱敏工具类
 * 提供字符串脱敏功能，可指定保留前几位和后几位字符
 */
public class DataMaskingUtil {
    /**
     * 数据脱敏方法 - 前一后一格式
     * @param input 输入字符串
     * @param keepPrefix 保留前缀长度
     * @param keepSuffix 保留后缀长度
     * @return 脱敏后的字符串
     */
    public static String mask(String input, int keepPrefix, int keepSuffix) {
        // 处理空值或null情况
        if (input == null || input.isEmpty()) {
            return input;
        }

        int length = input.length();

        // 特殊情况：长度为2时，只保留第一位
        if (length == 2) {
            return input.substring(0, 1) + "*";
        }

        // 特殊情况：长度小于等于1时，直接返回
        if (length <= 1) {
            return input;
        }

        // 调整保留长度，确保合理
        keepPrefix = Math.min(keepPrefix, length);
        keepSuffix = Math.min(keepSuffix, length - keepPrefix);

        StringBuilder result = new StringBuilder();

        // 添加前缀
        result.append(input.substring(0, keepPrefix));

        // 添加脱敏部分（使用*代替）
        int maskLength = length - keepPrefix - keepSuffix;
        for (int i = 0; i < maskLength; i++) {
            result.append('*');
        }

        // 添加后缀
        if (keepSuffix > 0) {
            result.append(input.substring(length - keepSuffix));
        }

        return result.toString();
    }

    /**
     * 带最大长度限制的数据脱敏方法
     * @param input 输入字符串
     * @param keepPrefix 保留前缀长度
     * @param keepSuffix 保留后缀长度
     * @param maxLength 最大输出长度
     * @return 脱敏后的字符串
     */
    public static String mask(String input, int keepPrefix, int keepSuffix, int maxLength) {
        // 调用基础脱敏方法
        String str = mask(input, keepPrefix, keepSuffix);

        // 限制最大长度
        if (str.length() > maxLength) {
            str = str.substring(0, maxLength);
        }

        return str;
    }

    /**
     * 前一后一格式的快捷脱敏方法
     * @param input 输入字符串
     * @return 脱敏后的字符串
     */
    public static String maskFirstLast(String input) {
        return mask(input, 1, 1);
    }

    /**
     * 带最大长度限制的前一后一格式脱敏方法
     * @param input 输入字符串
     * @param maxLength 最大输出长度
     * @return 脱敏后的字符串
     */
    public static String maskFirstLast(String input, int maxLength) {
        return mask(input, 1, 1, maxLength);
    }
}
