package cz.vutbr.feec.iodata;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.InetAddress;

import cz.vutbr.feec.session.gnp.LandmarkInfo;

/**
 * Třída zajišťuje načtení konfiguračních informací ze souborů *.conf ve složce /config/.
 * @author Petr Pospíšil
 * 
 */
public class ReadConfig {

	private static int numOfFixed = 0, numOfDynamic = 0;
	private static LandmarkInfo[] lmList, lmListFixed, lmListDynamic;
	private static int[][] testConf;
	
	/**
	 * počet landmarků:rozptyl:max RTT:počet měření
	 * rozptyl udává o kolik landmarků bude větší pole, z něhož se teprve bude vybírat 
	 * náhodně počet landmarků použitých k odhadu.
	 * Landmark, který při měření překročí hodnotu max RTT bude označen za nedostupný a měření se provede 
	 * s jiným landmarkem
	 * @param numOfParameters je počet parametrů, které budou z konfiguračního souboru načteny
	 * @return int[index testů][index parametrů]
	 * @throws IOException
	 */
	public static int[][] readTestConfiguration(int numOfParameters) throws IOException {
		final String NOTE = "#";
		final String SEPARATOR = ":";
		String radka, znak;
		int configCounter = 0;
		FileReader fr = null;
		
		try {
			fr = new FileReader("config/test_parameters.conf");
			BufferedReader in = new BufferedReader(fr);
			
			while((radka = in.readLine()) != null) {
				if(radka.length() != 0) {
					radka = radka.trim();
					znak = radka.substring(0, 1);
				}
				else znak = NOTE;
				
				if(!znak.equals(NOTE)) {
					String[] splitLine = radka.split(SEPARATOR);
					boolean isEmpty = false;
					empty:for(int i=0; i<numOfParameters; i++) {
						if(splitLine[i].isEmpty()) {
							isEmpty = true;
							break empty;
						}
					}
					if(!isEmpty) {
							configCounter++;
					}
					else System.err.println("Error in file!");
				}
			}
			fr.close();
			fr = new FileReader("config/test_parameters.conf");
			in = new BufferedReader(fr);
			testConf = new int[configCounter][numOfParameters];
			configCounter = 0;
			
			while((radka = in.readLine()) != null) {
				if(radka.length() != 0) {
					radka = radka.trim();
					znak = radka.substring(0, 1);
				}
				else znak = NOTE;
				
				if(!znak.equals(NOTE)) {
					String[] splitLine = radka.split(SEPARATOR);
					boolean isEmpty = false;
					empty:for(int i=0; i<numOfParameters; i++) {
						if(splitLine[i].isEmpty()) {
							isEmpty = true;
							break empty;
						}
					}
					if(!isEmpty) {
							for(int i=0; i<numOfParameters; i++) {
								testConf[configCounter][i] = Integer.valueOf(splitLine[i]).intValue();		
							}
							configCounter++;
					}
					else System.err.println("Error in file!");
				}
			}	
			fr.close();

		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		finally {
			if(fr != null) fr.close();
		}
		return testConf;
	}
	
	/**
	 * Metoda pro načtení pozice stanice, na které probíhá daný test. Na základě informace 
	 * o jméně hosta, který je předán jako parametr dojde k nalezení řádku s tímto jménem 
	 * a ten obsahuje i informace o pozici hosta - zeměpisnou šířku a délku.
	 * @param hostName typu String určuje jméno hosta v konfiguračním souboru
	 * @return position[latitude,longitude]
	 * @author Petr Pospíšil
	 * @throws IOException 
	 */
	public static float[] readHostPosition(String hostName) throws IOException {
		final String NOTE = "#";
		final String SEPARATOR = ":";
		String radka, znak;
		float[] position = new float[2];
		FileReader fr = null;
		
		try {
			fr = new FileReader("config/hosts_list.conf");
			BufferedReader in = new BufferedReader(fr);
			
			block:while((radka = in.readLine()) != null) {
				if(radka.length() != 0) {
					radka = radka.trim();
					znak = radka.substring(0, 1);
				}
				else znak = NOTE;
				
				if(!znak.equals(NOTE)) {
					String[] splitLine = radka.split(SEPARATOR);
					
					if(!splitLine[0].isEmpty() && !splitLine[1].isEmpty() && !splitLine[2].isEmpty()) {
						if(splitLine[0].equalsIgnoreCase(hostName)) {
							position[0] = Float.valueOf(splitLine[1]).floatValue();
							position[1] = Float.valueOf(splitLine[2]).floatValue();
							break block;
						}
					}
					else System.err.println("Error in file!");
				}
			}	
			fr.close();

		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		finally {
			if(fr != null) fr.close();
		}
		return position;
	}
	
	public static LandmarkInfo[] readLmList(String fileName) throws IOException {
		//nacteni pozic Landmarků
		final String NOTE = "#";
		final String SEPARATOR = ":";
		final String MARK_FIXED = "F";
		final String MARK_DYNAMIC = "D";
		String radka, znak;
		FileReader fr = null;
		numOfFixed = 0;
		numOfDynamic = 0;
		
		try {
			fr = new FileReader("config/" + fileName);
			BufferedReader in = new BufferedReader(fr);
			
			while((radka = in.readLine()) != null) {
				if(radka.length() != 0) {
					radka = radka.trim();
					znak = radka.substring(0, 1);
				}
				else znak = NOTE;
				
				if(!znak.equals(NOTE)) {
					String[] splitLine = radka.split(SEPARATOR);
					if(!splitLine[1].isEmpty()) {
						if(splitLine[1].equalsIgnoreCase(MARK_FIXED)) numOfFixed++;
						else if(splitLine[1].equalsIgnoreCase(MARK_DYNAMIC)) numOfDynamic++;
					}
					else System.err.println("Chyba v souboru!");
				}
			}
			fr.close();
			lmListFixed = new LandmarkInfo[numOfFixed];
			lmListDynamic = new LandmarkInfo[numOfDynamic];
			lmList = new LandmarkInfo[numOfFixed+numOfDynamic];
			fr = new FileReader("config/" + fileName);
			in = new BufferedReader(fr);
			int l=0, f=0, d=0;
			
			while((radka = in.readLine()) != null) {
				if(radka.length() != 0) {
					radka = radka.trim();
					znak = radka.substring(0, 1);
				}
				else znak = NOTE;
				
				if(!znak.equals(NOTE)) {
					String[] splitLine = radka.split(SEPARATOR);
					
					if(!splitLine[0].isEmpty() && !splitLine[1].isEmpty()) {
						if(splitLine[1].equalsIgnoreCase(MARK_FIXED)) {
							lmListFixed[f++] = new LandmarkInfo(true, InetAddress.getByName(splitLine[0]), 
									Float.valueOf(splitLine[2]).floatValue(), Float.valueOf(splitLine[3]).floatValue(),
									Integer.valueOf(splitLine[4]).intValue());
						}
						else if(splitLine[1].equalsIgnoreCase(MARK_DYNAMIC)) {
							lmListDynamic[d++] = new LandmarkInfo(false, InetAddress.getByName(splitLine[0]), 
									Float.valueOf(splitLine[2]).floatValue(), Float.valueOf(splitLine[3]).floatValue(), 
									Integer.valueOf(splitLine[4]).intValue());
						}
						lmList[l++] = new LandmarkInfo(splitLine[1].equalsIgnoreCase(MARK_FIXED), 
								InetAddress.getByName(splitLine[0]), Float.valueOf(splitLine[2]).floatValue(), 
								Float.valueOf(splitLine[3]).floatValue(), Integer.valueOf(splitLine[4]).intValue());		
					}
					else System.err.println("Chyba v souboru!");
				}
			}	
			fr.close();

		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			if(fr != null) fr.close();
		}
		return lmList;
	}
	
	public LandmarkInfo[] getLmList() {
		return lmList;
	}
	
	public LandmarkInfo[] getLmListFixed() {
		return lmListFixed;
	}

	public LandmarkInfo[] getLmListDynamic() {
		return lmListDynamic;
	}
}
