package incheon.com.config;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springmodules.validation.commons.DefaultBeanValidator;
import org.springmodules.validation.commons.DefaultValidatorFactory;

/**
 * @ClassName : EgovConfigAppValidator.java
 * @Description : Validator 설정
 *
 * @author : 윤주호
 * @since  : 2021. 7. 20
 * @version : 1.0
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일              수정자               수정내용
 *  -------------  ------------   ---------------------
 *   2021. 7. 20    윤주호               최초 생성
 * </pre>
 *
 */
@Configuration
public class EgovConfigAppValidator {

	@Bean
	public DefaultBeanValidator beanValidator() {
		DefaultBeanValidator defaultBeanValidator = new DefaultBeanValidator();
		defaultBeanValidator.setValidatorFactory(validatorFactory());
		return defaultBeanValidator;

	}

	/** validation config location 설정
	 * @return
	 */
	@Bean
	public DefaultValidatorFactory validatorFactory() {
		DefaultValidatorFactory defaultValidatorFactory = new DefaultValidatorFactory();

		defaultValidatorFactory.setValidationConfigLocations(getValidationConfigLocations());

		return defaultValidatorFactory;
	}

	private Resource[] getValidationConfigLocations() {
		PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();

		List<Resource> validationConfigLocations = new ArrayList<Resource>();

		// 기본 validation rules 파일 추가
		Resource validationRulesConfig = pathMatchingResourcePatternResolver
				.getResource("classpath:/incheon/validator/validator-rules-let.xml");
		validationConfigLocations.add(validationRulesConfig);

		// 추가 validation 파일들이 있다면 여기에 추가
		try {
			// validator 디렉토리 하위의 모든 XML 파일 검색 (let 디렉토리 제외)
			Resource[] additionalValidationFiles = pathMatchingResourcePatternResolver
				.getResources("classpath:/incheon/validator/*.xml");
			
			// validator-rules-let.xml 제외하고 추가
			for (Resource resource : additionalValidationFiles) {
				String filename = resource.getFilename();
				if (filename != null && !filename.equals("validator-rules-let.xml")) {
					validationConfigLocations.add(resource);
				}
			}
		} catch (IOException e) {
			throw new RuntimeException("Validator 설정 파일 로드 중 오류가 발생했습니다.", e);
		}

		return validationConfigLocations.toArray(new Resource[validationConfigLocations.size()]);
	}
}
