package project;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.channels.FileLockInterruptionException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import javax.swing.JTextField;


public class FormFactoryV1 {
	
	
	
	Map<String,GenericForm3> formCollection=new HashMap<String,GenericForm3>();
	
	public FormFactoryV1(Repository repository){
		
		FormConfiguration configurator1=FormFactoryV1.getFormConfigurator1("project.Participant",1);
		configurator1.setRepository(repository);
		FormConfiguration configurator2=FormFactoryV1.getFormConfigurator2("project.Relationships",2);
		configurator2.setRepository(repository);
		FormConfiguration configurator3=FormFactoryV1.getFormConfigurator3("project.Interests",2);
		configurator3.setRepository(repository);
		
		GenericForm3 form1=new GenericForm3(configurator1);
		formCollection.put(configurator1.getFormName(), form1);
		
		GenericForm3 form2=new GenericForm3(configurator2);
		formCollection.put(configurator2.getFormName(), form2);
		
		GenericForm3 form3=new GenericForm3(configurator3);
		formCollection.put(configurator3.getFormName(), form3);
	}
	
	public Map<String,GenericForm3> getForms(){
		return formCollection;
	}
	
	public static FormConfiguration getFormConfigurator2(String formName,int gridSize){
		
		FormConfiguration formConfigurator=new FormConfiguration();
		String[] labelNames={"ID","FirstRelationship Age","Status","Longest Relationship","Sexual Orientation","Parents Status","Partnership Duration","Principles","Religion","Children","Siblings","Virgin","Health","Sex Life","Attractiveness","Happiness"};
		String[] fieldNames={"Id","FirstRelationshipAge","Status","LongestRelationship","SexualOrientation","ParentsStatus","PartnershipDuration","Principles","Religion","Children","Siblings","Virgin","Health","SexLife","Attractiveness","Happiness"};
		Class<?>[] fieldClass=new Class[] {RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextArea.class,
				RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RadioButtons.class,RadioButtons.class,RadioButtons.class,RadioButtons.class,RadioButtons.class};
		int[] fieldSize=new int[] {5,5,25,25,25,25,25,25,25,5,5};
		int[] verifiers= new int[]{0,1,2,2,2,2,2,0,2,1,1,0,0,0,0,0};
		int[] directions= new int[]{0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1};
		
		Hashtable<Integer, List<String>> fieldOptionsDisplay=new Hashtable<>();
		List<String> listDisplay=Arrays.asList("Yes","No");
		
		Hashtable<Integer, List<String>> fieldOptionsValues=new Hashtable<>();
		List<String> listValues=Arrays.asList("1","0");
		
		fieldOptionsDisplay.put(11,listDisplay);
		fieldOptionsValues.put(11,listValues);
		listDisplay=Arrays.asList("1","2","3","4","5");
		listValues=Arrays.asList("1","2","3","4","5");
		
		fieldOptionsDisplay.put(12,listDisplay);
		fieldOptionsValues.put(12,listValues);
		fieldOptionsDisplay.put(13,listDisplay);
		fieldOptionsValues.put(13,listValues);
		fieldOptionsDisplay.put(14,listDisplay);
		fieldOptionsValues.put(14,listValues);
		fieldOptionsDisplay.put(15,listDisplay);
		fieldOptionsValues.put(15,listValues);
		
		formConfigurator.setLabelNames(labelNames);
		formConfigurator.setFieldNames(fieldNames);
		formConfigurator.setFieldClass(fieldClass);
		formConfigurator.setFieldSize(fieldSize);
		formConfigurator.setFieldOptionsDisplay(fieldOptionsDisplay);
		formConfigurator.setFieldOptionsValue(fieldOptionsValues);
		formConfigurator.setGridSize(gridSize);
		formConfigurator.setVerifiers(verifiers);
		formConfigurator.setDirection(directions);
		formConfigurator.setFormName("Relationship");
		
		Object formDataObject=null;
		 
		
		try {
			 //formDataObject=Class.forName(formName).newInstance();
			 formConfigurator.setFormClass(Class.forName(formName));
			 formConfigurator.setFormData(formDataObject);
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return formConfigurator;
	}
	
public static FormConfiguration getFormConfigurator1(String formName,int gridSize){
		
		FormConfiguration formConfigurator=new FormConfiguration();
		String[] labelNames={"Id","Age","Gender","Ethnicity","Occupation","Country","Origin","Education"};
		String[] fieldNames=labelNames;
		Class<?>[] fieldClass=new Class[] {JTextField.class,RoundedTextField.class,RadioButtons.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RadioButtons.class};
		int[] fieldSize=new int[] {5,5,25,25,25,25,25,25};
		int[] verifiers= new int[]{0,1,0,2,2,2,2,2};
		int[] directions= new int[]{0,0,1,0,0,0,0,2};
		
		Hashtable<Integer, List<String>> fieldOptionsDisplay=new Hashtable<>();
		Hashtable<Integer, List<String>> fieldOptionsValues=new Hashtable<>();
		List<String> listDisplay=Arrays.asList("Male","Female");
		List<String> listValues=Arrays.asList("Male","Female");
		fieldOptionsDisplay.put(2,listDisplay);
		fieldOptionsValues.put(2,listValues);
		
		listDisplay=Arrays.asList("Did not attend school","Primary School","Secondary School","College/6th Form","University(Undergraduate)","Universirty(Post Graduate)","Other");
		listValues=listDisplay;
		fieldOptionsDisplay.put(7,listDisplay);
		fieldOptionsValues.put(7,listValues);
		
		formConfigurator.setLabelNames(labelNames);
		formConfigurator.setFieldNames(fieldNames);
		formConfigurator.setFieldClass(fieldClass);
		formConfigurator.setFieldSize(fieldSize);
		formConfigurator.setFieldOptionsValue(fieldOptionsValues);
		formConfigurator.setFieldOptionsDisplay(fieldOptionsDisplay);
		formConfigurator.setGridSize(gridSize);
		formConfigurator.setVerifiers(verifiers);
		formConfigurator.setDirection(directions);
		formConfigurator.setFormName("Participant");
		Object formDataObject=null;
		 
		
		try {
			
			// formDataObject=Class.forName(formName).newInstance();
			 formConfigurator.setFormClass(Class.forName(formName));
			 formConfigurator.setFormData(formDataObject);
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return formConfigurator;
	}

public static FormConfiguration getFormConfigurator3(String formName,int gridSize){
	
	FormConfiguration formConfigurator=new FormConfiguration();
	String[] labelNames={"Id","Alchocol Units","TV","Books","Best Attributes","Famil Gathering","Criminal Conviction","Hobbies","Describe Yourself","Free Time","Disappointment",
			"Excersise Per Week","Food","movies","Music","Worst Attribute","Smoke","Menopause","Favourite Quote",
			"Aspiration","Achievement","Passion"};
	String[] fieldNames={"Id","AlcoholUnits","Tv","Books","BestAttribute","FamilyGathering","CriminalConviction","Hobbies","DescribeYourself",
			"FreeTime","Disappointment","ExercisePerWeek","Food", "Movies","Music","WorstAttribute","Smoke","Menopause",
			"FavouriteQuote","Aspiration","Achievement","Passion"};
	Class<?>[] fieldClass=new Class[] {RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,
			RadioButtons.class,RadioButtons.class,RoundedTextArea.class,RoundedTextArea.class,RoundedTextArea.class,RoundedTextArea.class,
			RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RoundedTextField.class,RadioButtons.class,RadioButtons.class,
			RoundedTextArea.class,RoundedTextArea.class,RoundedTextArea.class,RoundedTextArea.class};
	int[] fieldSize=new int[] {5,5,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20};
	int[] verifiers= new int[]{0,1,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0};
	int[] directions= new int[]{0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0};
	
	Hashtable<Integer, List<String>> fieldOptionsDisplay=new Hashtable<>();
	Hashtable<Integer, List<String>> fieldOptionsValues=new Hashtable<>();
	List<String> listDisplay=Arrays.asList("Yes","No");
	List<String> listValues=Arrays.asList("1","0");
	for (int i=5;i<7;i++){
		fieldOptionsDisplay.put(i,listDisplay);
		fieldOptionsValues.put(i,listValues);
	}
	for (int i=16;i<18;i++){
		fieldOptionsDisplay.put(i,listDisplay);
		fieldOptionsValues.put(i,listValues);
	}

	
	
	formConfigurator.setLabelNames(labelNames);
	formConfigurator.setFieldNames(fieldNames);
	formConfigurator.setFieldClass(fieldClass);
	formConfigurator.setFieldSize(fieldSize);
	formConfigurator.setFieldOptionsValue(fieldOptionsValues);
	formConfigurator.setFieldOptionsDisplay(fieldOptionsDisplay);
	formConfigurator.setGridSize(gridSize);
	formConfigurator.setVerifiers(verifiers);
	formConfigurator.setDirection(directions);
	formConfigurator.setFormName("Interests");
	Object formDataObject=null;
	
	 
	
	try {
		
		// formDataObject=Class.forName(formName).newInstance();
		 formConfigurator.setFormClass(Class.forName(formName));
		 formConfigurator.setFormData(formDataObject);
		
		
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return formConfigurator;
}

static Function<String,ConfigAttribute> mapToConfig=(line) -> {
	String[] attributesArray=line.split("=");
	String[] attributeValues=attributesArray[1].split(",");
	String attributeName=attributesArray[0];
	System.out.println(attributeName);
	//System.out.println(attributeValues);
	Arrays.asList(attributeValues).forEach(System.out::print);
	ConfigAttribute configAttribute=new ConfigAttribute(attributeName, attributeValues,1);
	return configAttribute;
	
};

public static  ConfigAttribute mapToConfig1(String line) {
	String[] attributesArray=line.split("=");
	String[] attributeValues=attributesArray[1].split(",");
	String attributeName=attributesArray[0];
	System.out.println(attributeName);
	Arrays.asList(attributeValues).forEach(System.out::print);
	Arrays.asList(attributeValues).forEach(System.out::print);
	ConfigAttribute configAttribute=new ConfigAttribute(attributeName, attributeValues,1);
	return configAttribute;
}

public static  List<ConfigAttribute> csvParser(){
	List<ConfigAttribute> configAttributes=null;
	try {
		InputStream is=new FileInputStream(new File("config.txt"));
		BufferedReader br=new BufferedReader(new InputStreamReader(is));
		configAttributes=br.lines()
				.map(FormFactoryV1::mapToConfig1)
				.collect(Collectors.toList());
		
		
		
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}
	return configAttributes;
	
}

public void createForms (){
	
	List<ConfigAttribute> configAttributes=csvParser();
	
	
}


}
