package io.github.dunwu.spring.core.validation;

import org.springframework.beans.BeanUtils;
import org.springframework.validation.Errors;

import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public abstract class AbstractValidatorRule implements ValidatorRule {

	@Override
	public abstract boolean support(Annotation annotation);

	@Override
	public void valid(Annotation annotation, Object target, final Field field, final Errors errors) throws Exception {
		PropertyDescriptor propertyDescriptor = BeanUtils.getPropertyDescriptor(target.getClass(), field.getName());
		Method reader = propertyDescriptor.getReadMethod();
		Object property = reader.invoke(target);
		validProperty(annotation, property,
			(errorCode, message) -> errors.rejectValue(field.getName(), errorCode, message));
	}

	public abstract void validProperty(Annotation annotation, Object property, PostHandler postHandler);

	interface PostHandler {

		void postHanle(String errorCode, String message);

	}

}