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

import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @description N选1校验方法，值必须是指定集合中的一个
 * @filename InSetValidateMethod.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-12-18
 */
public class InSetValidateMethod implements ValidateMethod {

    private final Set<Object> allowedValues;
    private final String errorMessage;

    /**
     * @description 构造函数
     * @param fieldLabel 字段标签
     * @param allowedValues 允许的值集合
     */
    public InSetValidateMethod(String fieldLabel, Collection<?> allowedValues) {
        this.allowedValues = allowedValues.stream().map(v -> (Object) v).collect(Collectors.toSet());
        this.errorMessage = fieldLabel + "必须是以下值之一: " + formatValues(allowedValues);
    }

    /**
     * @description 构造函数（自定义错误信息）
     * @param fieldLabel 字段标签
     * @param allowedValues 允许的值集合
     * @param customErrorMessage 自定义错误信息
     */
    public InSetValidateMethod(String fieldLabel, Collection<?> allowedValues, String customErrorMessage) {
        this.allowedValues = allowedValues.stream().map(v -> (Object) v).collect(Collectors.toSet());
        this.errorMessage = customErrorMessage;
    }

    @Override
    public Boolean validate(Object value) {
        if (value == null) {
            return false;
        }
        return allowedValues.contains(value);
    }

    @Override
    public String getErrorMessage() {
        return errorMessage;
    }

    @Override
    public String getName() {
        return "N选1校验";
    }

    /**
     * @description 格式化允许值列表
     * @param values 值集合
     * @return 格式化后的字符串
     */
    private String formatValues(Collection<?> values) {
        return values.stream()
                .map(v -> v instanceof String ? "\"" + v + "\"" : String.valueOf(v))
                .collect(Collectors.joining(", ", "[", "]"));
    }
}
