package com.spring.common.validation;

import java.util.Collection;

import org.springframework.lang.NonNull;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

/**
 * 컬렉션의 유효성을 검사하는 Validator 클래스입니다.
 * 
 * <p>이 클래스는 Spring의 Validator 인터페이스를 구현하여,
 * 컬렉션 내의 각 요소에 대해 유효성 검사를 수행합니다.</p>
 * 
 * <p>주어진 LocalValidatorFactoryBean을 사용하여 각 요소의 유효성을 검사합니다.</p>
 * 
 * @author mindol
 * @version 1.0
 */
public class CollectionValidator implements Validator {
    /**
     * 요소의 유효성을 검사하는 Validator 객체입니다.
     * 
     * <p>LocalValidatorFactoryBean을 사용하여 초기화됩니다.</p>
     */
    private final Validator validator;

    /**
     * CollectionValidator 생성자입니다.
     * 
     * <p>주어진 LocalValidatorFactoryBean을 사용하여 CollectionValidator를 초기화합니다.</p>
     * 
     * @param validatorFactory 유효성 검사기 팩토리
     */
    public CollectionValidator(LocalValidatorFactoryBean validatorFactory) {
        this.validator = validatorFactory;
    }

    /**
     * 주어진 클래스 타입에 대해 이 Validator가 지원하는지 확인합니다.
     * 
     * <p>현재 구현에서는 모든 클래스 타입을 지원하도록 true를 반환합니다.</p>
     * 
     * @param clazz 검사할 클래스 타입
     * @return 항상 true
     */
    @Override
    public boolean supports(@NonNull Class<?> clazz) {
        return true;
    }

    /**
     * 주어진 객체의 유효성을 검사합니다.
     * 
     * <p>객체가 컬렉션인 경우, 컬렉션의 각 요소에 대해 유효성 검사를 수행합니다.</p>
     * 
     * @param target 검사할 객체
     * @param errors 유효성 검사 중 발생한 오류를 저장할 객체
     */
    @Override
    public void validate(@NonNull Object target, @NonNull Errors errors) {
        if (target instanceof Collection<?>) {
            Collection<?> collection = (Collection<?>) target;
            for (Object object : collection) {
                ValidationUtils.invokeValidator(validator, object, errors);
            }
        }
    }
}
