/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.utils.fillertext.test;

import java.util.Locale;

import org.eclipse.osbp.utils.fillertext.FillerTextProvider;
import org.eclipse.osbp.utils.fillertext.FillerTextType;

/**
 *  Example generating some filler text ("Blindtext").<br>
 *  It's not possible to unit test it, because everytime new values will be generated! 
 */
public class FillerTextExample {
	
	private static void result(String variable, Object...values) {
		System.out.format("%-50s >", variable);
		for	(Object value : values) {
			System.out.print(" = "+value.toString());
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		
		Locale [] locales = new Locale[] {
			Locale.GERMAN,
			Locale.ENGLISH,
			Locale.forLanguageTag("pl")
		};

		// --- sample using the api in different ways ---
		System.out.println("=== api examples ===");
		{
			FillerTextProvider provider = FillerTextProvider.get(Locale.GERMAN);
			
			// --- it's possible to use either the generic {@link FillerTextProvider#generate()} or the specific methods ---
			System.out.println("--- some date and time filler texts ---");
			result("Date 'past 10 years' via enum",					provider.generate(FillerTextType.DATE, -10));
			result("Date 'past 10 years' via string",				provider.generate("date", -10));
			result("Date 'past 10 years' via string",				provider.generate("DATE", -10));
			result("Date 'past 10 years' via API",					provider.date(-10));
			
			result("Date 'future 5 years'",							provider.generate("Date", 5));
			
			result("Date 'between 1980 and 1990'",					provider.date(1980, 1990));
			result("Date 'between past 10 and future 20 years'",	provider.date(-10, 20));
			
			result("Time",											provider.time());

			result("Timestamp within this year",					provider.timestamp());

			System.out.println("--- some integer and double filler texts ---");
			result("Unsigned Integer - default", 			(Integer)provider.unsignedinteger());
			result("Unsigned Integer - maximum 365", 		(Integer)provider.unsignedinteger(365), (Integer)provider.generate("unsignedinteger", 365), (Integer)provider.generate(FillerTextType.UNSIGNEDINTEGER, 365));
			result("Unsigned Integer - between 18 and 65", 	(Integer)provider.unsignedinteger(18, 65));
			
			result("Signed Integer - default", 				(Integer)provider.signedinteger());
			result("Signed Integer - range -365 to 365",	(Integer)provider.signedinteger(365), (Integer)provider.generate("signedinteger", 365), (Integer)provider.generate(FillerTextType.SIGNEDINTEGER, 365));
			result("Signed Integer - between -18 and 65", 	(Integer)provider.signedinteger(-18, 65), (Integer)provider.generate("signedinteger", -18, 65), (Integer)provider.generate(FillerTextType.SIGNEDINTEGER, -18, 65));
			
			result("Unsigned Double - default", 						(Double)provider.unsigneddouble());
			result("Unsigned Double - 3 decimals",	 					(Double)provider.unsigneddouble(3));
			result("Unsigned Double - 1 decimal, max 10",				(Double)provider.unsigneddouble(1, 10.0), (Double)provider.generate("unsigneddouble", 1, 10.0), (Double)provider.generate(FillerTextType.UNSIGNEDDOUBLE, 1, 10.0));
			result("Unsigned Double - 1 decimal, between 10 and 20", 	(Double)provider.unsigneddouble(1, 10.0, 20.0), (Double)provider.generate("unsigneddouble", 1, 10.0, 20.0), (Double)provider.generate(FillerTextType.UNSIGNEDDOUBLE, 1, 10.0, 20.0));
			
			result("Unsigned Double - default", 						(Double)provider.signeddouble());
			result("Unsigned Double - 3 decimals",	 					(Double)provider.signeddouble(3));
			result("Unsigned Double - 1 decimal, range -10 to 10",		(Double)provider.signeddouble(1, 10.0), (Double)provider.generate("signeddouble", 1, 10.0), (Double)provider.generate(FillerTextType.SIGNEDDOUBLE, 1, 10.0));
			result("Unsigned Double - 1 decimal, between -10 and 20", 	(Double)provider.signeddouble(1, -10.0, 20.0), (Double)provider.generate("signeddouble", 1, -10.0, 20.0), (Double)provider.generate(FillerTextType.SIGNEDDOUBLE, 1, -10.0, 20.0));

			System.out.println("--- some text filler texts ---");
			result("one word", 		provider.word());
			result("5 words", 		provider.words(5));
			result("one sentence", 	provider.sentence());
			result("5 sentences", 	provider.sentences(5));
			result("one paragraph", provider.paragraph());
			result("5 paragraphs", 	provider.paragraphs(5));
			
//			System.out.println("--- a example person filler text ---");
//			result("First name",	provider.firstName(), provider.generate("firstname"), provider.generate(FillerTextType.FIRSTNAME));
//			result("Last name",		provider.lastName(), provider.generate("lastName"), provider.generate(FillerTextType.LASTNAME));
//			result("Full name",		provider.fullName(), provider.generate("fullName"), provider.generate(FillerTextType.FULLNAME));
//			result("Email",			provider.email(), provider.generate("email"), provider.generate(FillerTextType.EMAIL));
//			result("City",			provider.city(), provider.generate("city"), provider.generate(FillerTextType.CITY));
//			result("Postal code",	provider.postalCode(), provider.generate("postalCode"), provider.generate(FillerTextType.POSTALCODE));

//			System.out.println("--- THE SAME example person filler text ---");
//			result("First name",	provider.firstName());
//			result("Last name",		provider.generate(FillerTextType.LASTNAME));
//			result("Full name",		provider.generate("fullname"));
//			result("Email",			provider.email());
//			result("City",			provider.city());
//			result("Postal code",	provider.postalCode());
			
//			System.out.println("--- another example person filler text because of calling provider.reset() ---");
//			provider.reset();
//			result("First name",	provider.firstName());
//			result("Last name",		provider.generate(FillerTextType.LASTNAME));
//			result("Full name",		provider.generate("fullname"));
//			result("Email",			provider.email());
//			result("City",			provider.city());
//			result("Postal code",	provider.postalCode());
		}
		
		System.out.println("=== start ===");
		// --- traverse all requested locales ---
		for	(Locale locale : locales) {
			System.out.println("--- locale: "+locale.toString());
			
			FillerTextProvider provider = FillerTextProvider.get(locale);
			provider.reset();
			// --- use every filler text type ---
			for	(FillerTextType type : FillerTextType.values()) {
				result(type.toString(), provider.generate(type));
			}
			System.out.println();
		}
		System.out.println("=== done ===");
	}
	
}
