package org.xyzh.common.utils.validation.method;

import java.util.function.Supplier;

/**
 * @description 校验方法类型枚举
 * @filename ValidateMethodType.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-10-16
 */
public enum ValidateMethodType {
    
    /**
     * 密码校验（默认：6-20位，必须包含字母和数字）
     */
    PASSWORD("密码校验", PasswordValidateMethod.class, PasswordValidateMethod::new),
    
    /**
     * 强密码校验（8-20位，必须包含大小写字母、数字和特殊字符）
     */
    STRONG_PASSWORD("强密码校验", PasswordValidateMethod.class, 
            () -> new PasswordValidateMethod(8, 20, true, true, true, true)),
    
    /**
     * 身份证号校验（支持15位和18位）
     */
    ID_CARD("身份证号校验", IdCardValidateMethod.class, IdCardValidateMethod::new),
    
    /**
     * 手机号码校验（中国大陆）
     */
    PHONE("手机号码校验", PhoneValidateMethod.class, PhoneValidateMethod::new),
    
    /**
     * 手机号码校验（宽松模式，支持大陆、香港、台湾）
     */
    PHONE_LOOSE("手机号码校验（宽松）", PhoneValidateMethod.class, 
            () -> new PhoneValidateMethod(false)),
    
    /**
     * 邮箱地址校验
     */
    EMAIL("邮箱地址校验", EmailValidateMethod.class, EmailValidateMethod::new),
    
    /**
     * URL链接校验
     */
    URL("URL链接校验", UrlValidateMethod.class, UrlValidateMethod::new),
    
    /**
     * HTTPS链接校验
     */
    HTTPS_URL("HTTPS链接校验", UrlValidateMethod.class, 
            () -> new UrlValidateMethod(true)),
    
    /**
     * 银行卡号校验
     */
    BANK_CARD("银行卡号校验", BankCardValidateMethod.class, BankCardValidateMethod::new),
    
    /**
     * 中文字符校验（纯中文）
     */
    CHINESE("中文字符校验", ChineseValidateMethod.class, ChineseValidateMethod::new),
    
    /**
     * 中文字符校验（允许标点符号）
     */
    CHINESE_WITH_PUNCTUATION("中文字符校验（含标点）", ChineseValidateMethod.class, 
            () -> new ChineseValidateMethod(true));
    
    /**
     * 校验方法名称
     */
    private final String name;
    
    /**
     * 校验方法实现类
     */
    private final Class<? extends ValidateMethod> methodClass;
    
    /**
     * 校验方法实例提供者
     */
    private final Supplier<ValidateMethod> methodSupplier;
    
    ValidateMethodType(String name, Class<? extends ValidateMethod> methodClass, 
                       Supplier<ValidateMethod> methodSupplier) {
        this.name = name;
        this.methodClass = methodClass;
        this.methodSupplier = methodSupplier;
    }
    
    /**
     * @description 获取校验方法名称
     * @return String
     */
    public String getName() {
        return name;
    }
    
    /**
     * @description 获取校验方法实现类
     * @return Class
     */
    public Class<? extends ValidateMethod> getMethodClass() {
        return methodClass;
    }
    
    /**
     * @description 创建校验方法实例
     * @return ValidateMethod
     */
    public ValidateMethod createInstance() {
        return methodSupplier.get();
    }
    
    /**
     * @description 根据名称获取枚举
     * @param name 名称
     * @return ValidateMethodType
     */
    public static ValidateMethodType fromName(String name) {
        for (ValidateMethodType type : values()) {
            if (type.getName().equals(name)) {
                return type;
            }
        }
        return null;
    }
}

