import static java.lang.System.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

public class ValidatingData {

	public static void main(String[] args) {

		String testData = "Fran�ois Moreau";
		//String testData = "12334";
		String type = "int";
		String dateFormat = "MM/dd/yyyy";

		//validateText(testData, type);
		//out.println(validateDate(testData,dateFormat));

		//out.println(validateEmail(testData));
		//out.println(validateEmailStandard(testData));

		//validateZip(testData);
		testData = "Bobby Smith, Jr.";
		validateName(testData);
		testData = "Bobby Smith the 4th";
		validateName(testData);
		testData = "Albrecht M�ller";
		validateName(testData);
		testData = "Fran�ois Moreau";
		validateName(testData);

	}

	public static void validateText(String toValidate, String format){
		switch (format) {
		case "int": out.println(validateInt(toValidate)); 
		case "float": out.println(validateFloat(toValidate)); 
		}
	}

	public static String validateInt(String text){
		String result = text + " is not a valid integer";
		try{
			int validInt = Integer.parseInt(text);
			result = validInt + " is a valid integer";
			out.println(result);
			return result;
		}catch(NumberFormatException e){
			out.println(result);
			return result;
		}
	}

	public static String validateFloat(String text){
		String result = "Data '" + text + "' is not a valid floating point number";
		try{
			float validFloat = Float.parseFloat(text);
			result = validFloat + " is a valid floating point number";
			return result;
		}catch(NumberFormatException e){
			return result;
		}
	}

	public static String validateDate(String theDate, String dateFormat){

		try {
			SimpleDateFormat format = new SimpleDateFormat(dateFormat);
			Date test = format.parse(theDate);
			if(format.format(test).equals(theDate)){
				return theDate.toString() + " is a valid date";
			}else{
				return theDate.toString() + " is not a valid date";
			}
		} catch (ParseException e) {
			return theDate.toString() + " is not a valid date";
		}

	}

	public static String validateEmail(String email) {
		//String emailRegex = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
		String emailRegex = "^[a-zA-Z0-9.!$'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
		Pattern pattern = Pattern.compile(emailRegex);
		Matcher matcher = pattern.matcher(email);
		if(matcher.matches()){
			return email + " is a valid email address";
		}else{
			return email + " is not a valid email address";
		}
	}

	//make note about limitations of this standard library
	//see comments http://stackoverflow.com/questions/624581/what-is-the-best-java-email-address-validation-method
	public static String validateEmailStandard(String email){
		try{
			InternetAddress testEmail = new InternetAddress(email);
			testEmail.validate();
			return email + " is a valid email address";
		}catch(AddressException e){
			return email + " is not a valid email address";
		}
	}

	public static void validateZip(String zip){
		//Note can be useful to customize postal code formats across the world
		String zipRegex = "^[0-9]{5}(?:-[0-9]{4})?$";
		Pattern pattern = Pattern.compile(zipRegex);
		Matcher matcher = pattern.matcher(zip);
		if(matcher.matches()){
			out.println(zip + " is a valid zip code");
		}else{
			out.println(zip + " is not a valid zip code");
		}

	}

	public static void validateName(String name){
		//discuss different name formats, 
		String nameRegex = "^[\\p{L}\\s.',-]+$";
		Pattern pattern = Pattern.compile(nameRegex);
		Matcher matcher = pattern.matcher(name);
		if(matcher.matches()){
			out.println(name + " is a valid name");
		}else{
			out.println(name + " is not a valid name");
		}

	}

}