package org.yarnandtail.andhow.valid;

import java.time.LocalDateTime;
import org.yarnandtail.andhow.api.Validator;

/**
 * A collection of LocalDateTime validation types
 * 
 * @author ericeverman
 */
public abstract class LocalDateTimeValidator implements Validator<LocalDateTime> {
	
	protected LocalDateTime ref;
	
	@Override
	public boolean isSpecificationValid() {
		return ref != null;
	}
		
	@Override
	public String getInvalidSpecificationMessage() {
		return "The reference LocalDateTime cannot be null";
	}
	
	public static class Before extends LocalDateTimeValidator {

		public Before(LocalDateTime ref) {
			this.ref = ref;
		}

		@Override
		public boolean isValid(LocalDateTime value) {
			if (value != null) {
				return value.isBefore(ref);
			}
			return false;
		}
		
		@Override
		public String getTheValueMustDescription() {
			return "be before " + ref.toString();
		}
	}
	
	public static class SameTimeOrBefore extends LocalDateTimeValidator {

		public SameTimeOrBefore(LocalDateTime ref) {
			this.ref = ref;
		}

		@Override
		public boolean isValid(LocalDateTime value) {
			if (value != null) {
				return value.isBefore(ref) || value.isEqual(ref);
			}
			return false;
		}
		
		@Override
		public String getTheValueMustDescription() {
			return "be the same date and time or before " + ref.toString();
		}
	}
	
	public static class After extends LocalDateTimeValidator {

		public After(LocalDateTime ref) {
			this.ref = ref;
		}

		@Override
		public boolean isValid(LocalDateTime value) {
			if (value != null) {
				return value.isAfter(ref);
			}
			return false;
		}
		
		@Override
		public String getTheValueMustDescription() {
			return "be after " + ref.toString();
		}
	}
	
	public static class SameTimeOrAfter extends LocalDateTimeValidator {

		public SameTimeOrAfter(LocalDateTime ref) {
			this.ref = ref;
		}
		
		@Override
		public boolean isValid(LocalDateTime value) {
			if (value != null) {
				return value.isAfter(ref) || value.isEqual(ref);
			}
			return false;
		}
		
		@Override
		public String getTheValueMustDescription() {
			return "be the same date and time or after " + ref.toString();
		}
	}
	
}