package com.auth.common.model.valid.custom.enums;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 枚举值验证器
 */
public class EnumValueValidator implements ConstraintValidator<EnumerateValid, Object> {

    private List<Object> enumValues;
    private boolean ignoreCase;
    private boolean allowNull;

    @Override
    public void initialize(EnumerateValid constraintAnnotation) {
        Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClass();
        this.ignoreCase = constraintAnnotation.ignoreCase();
        this.allowNull = constraintAnnotation.allowNull();

        // 获取枚举的所有值
        Enum<?>[] enumConstants = enumClass.getEnumConstants();
        if (enumConstants != null) {
            this.enumValues = Arrays.stream(enumConstants)
                    .map(Enum::name)
                    .collect(Collectors.toList());
        }
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        // 如果允许为空且值为空，则通过校验
        if (value == null) return allowNull;

        // 处理字符串类型的值
        if (value instanceof String strValue) {
            if (ignoreCase) {
                return enumValues.stream()
                        .anyMatch(enumValue -> enumValue.toString().equalsIgnoreCase(strValue));
            } else {
                return enumValues.contains(strValue);
            }
        }

        // 处理枚举类型的值
        if (value instanceof Enum) {
            return enumValues.contains(((Enum<?>) value).name());
        }

        // 其他类型不通过校验
        return false;
    }
}
