package com.fs.company.util;

import com.fs.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Pattern;

/**
 * 手机号工具类
 * 提供手机号格式校验、脱敏等功能
 *
 * @author MixLiu
 * @date 2026/3/17 18:57
 */
public class PhoneNumberUtil {

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

    // ==================== 常量定义 ====================

    /**
     * 中国大陆手机号正则表达式
     * 规则说明：
     * 1. 以1开头
     * 2. 第二位为3-9之间的数字（目前运营商号段：13x、14x、15x、16x、17x、18x、19x）
     * 3. 后面跟着9位数字
     * 4. 总长度为11位
     */
    private static final String CHINA_MOBILE_REGEX = "^1[3-9]\\d{9}$";

    /**
     * 手机号正则编译对象（预编译提高性能）
     */
    private static final Pattern MOBILE_PATTERN = Pattern.compile(CHINA_MOBILE_REGEX);

    /**
     * 手机号长度
     */
    private static final int MOBILE_LENGTH = 11;

    // ==================== 校验方法 ====================

    /**
     * 校验手机号是否合法
     * <p>
     * 校验规则：
     * 1. 手机号不能为空
     * 2. 手机号长度必须为11位
     * 3. 手机号必须符合中国大陆手机号格式（以1开头，第二位为3-9，后跟9位数字）
     * </p>
     *
     * @param mobile 待校验的手机号
     * @return true-手机号合法；false-手机号不合法
     */
    public static boolean isValid(String mobile) {
        // 空值校验
        if (StringUtils.isBlank(mobile)) {
            log.error("手机号校验失败：手机号为空");
            return false;
        }
        // 去除首尾空格
        String trimmedMobile = mobile.trim();
        // 长度校验（手机号必须为11位）
        if (trimmedMobile.length() != MOBILE_LENGTH) {
            log.error("手机号校验失败：手机号长度不正确，当前长度={}", trimmedMobile.length());
            return false;
        }
        // 格式校验（使用正则表达式）
        boolean isValid = MOBILE_PATTERN.matcher(trimmedMobile).matches();
        if (!isValid) {
            log.error("手机号校验失败：手机号格式不正确，mobile={}", trimmedMobile);
        }
        return isValid;
    }

    /**
     * 校验手机号是否合法（带详细返回信息）
     * <p>
     * 校验规则同 {@link #isValid(String)}，但返回详细的校验结果信息
     * </p>
     *
     * @param mobile 待校验的手机号
     * @return 校验结果对象，包含是否合法及错误信息
     */
    public static ValidateResult validate(String mobile) {
        // 空值校验
        if (StringUtils.isBlank(mobile)) {
            return new ValidateResult(false, "手机号不能为空");
        }
        // 去除首尾空格
        String trimmedMobile = mobile.trim();
        // 长度校验
        if (trimmedMobile.length() != MOBILE_LENGTH) {
            return new ValidateResult(false, "手机号长度必须为11位");
        }
        // 格式校验
        if (!MOBILE_PATTERN.matcher(trimmedMobile).matches()) {
            return new ValidateResult(false, "手机号格式不正确，请输入有效的中国大陆手机号");
        }
        return new ValidateResult(true, "手机号校验通过");
    }

    // ==================== 脱敏方法 ====================

    /**
     * 手机号脱敏处理
     * <p>
     * 将手机号中间4位替换为*号，例如：13812345678 -> 138****5678
     * </p>
     *
     * @param mobile 原始手机号
     * @return 脱敏后的手机号，如果手机号为空或格式不正确则返回原始值
     */
    public static String mask(String mobile) {
        if (StringUtils.isBlank(mobile)) {
            return mobile;
        }
        String trimmedMobile = mobile.trim();
        if (trimmedMobile.length() != MOBILE_LENGTH) {
            return mobile;
        }
        return trimmedMobile.substring(0, 3) + "****" + trimmedMobile.substring(7);
    }

    // ==================== 内部类 ====================

    /**
     * 校验结果类
     * 用于返回详细的校验结果信息
     */
    public static class ValidateResult {
        /**
         * 是否校验通过
         */
        private boolean valid;
        /**
         * 校验结果消息
         */
        private String message;

        public ValidateResult(boolean valid, String message) {
            this.valid = valid;
            this.message = message;
        }

        public boolean isValid() {
            return valid;
        }

        public String getMessage() {
            return message;
        }

        @Override
        public String toString() {
            return "ValidateResult{" +
                    "valid=" + valid +
                    ", message='" + message + '\'' +
                    '}';
        }
    }
}
