package Klausur.Navi;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Navi {
	private static Map<String, Ort> orte = new HashMap<>();
	private static PriorityQueue<Ort> kandidaten = new PriorityQueue<>();

	public static void main(String[] args) throws FileNotFoundException {
		Scanner sc = new Scanner(new File("resources/orte.txt"));

		while (sc.hasNextLine()) {
			String line = sc.nextLine();

			String[] infos = line.split(",");

			String s1 = infos[0];
			String s2 = infos[1];
			
			System.out.println(s1 + " <> " + s2);

			Ort o1 = orte.get(s1);
			Ort o2 = orte.get(s2);

			if (o1 == null) {
				o1 = new Ort(s1);
				orte.put(s1, o1);
			}
			if (o2 == null) {
				o2 = new Ort(s2);
				orte.put(s2, o2);
			}

			int l = Integer.parseInt(infos[2]);
			Strasse s = new Strasse(o1, o2, l);
		} // while

		sc.close();

		System.out.println(orte.size() + " Orte angelegt.");
		
		// -------------------------------

		System.out.println("Wir wollen von HD nach KL.");
		Ort start = orte.get("Heidelberg");
		Ort ziel = orte.get("Kaiserslautern");

		System.out.println();
		System.out.println("Starte Navigation.");

		resetNavigation(start);
		
		navigiere(
				start, 
				ziel
				);
		
		System.out.println();
		
		System.out.println("Route: ");
		Ort ort = ziel;
		System.out.println(ort);

		while (!ort.getName().equals(start.getName())) {
			ort = ort.getVorgaenger();
			System.out.println(ort);
		}

		System.out.println("Fin.");
	}

	public static void resetNavigation(Ort start) {
		orte.values().forEach(o -> {
			o.reset();

			if (o.getName().equals(start.getName()))
				o.setEntfernung(0, null);
		});
	}

	public static void navigiere(Ort start, Ort ziel) {
		kandidaten.add(start);

		while (kandidaten.size() != 0) {
			Ort kandidat = kandidaten.poll();

			if (kandidat == ziel) {
				continue;
			}
			
			System.out.println("Betrachte: " + kandidat);
			
			for (Strasse s : kandidat.getStrassen()) {
				
				if (s.isErledigt())
					continue;
				
				Ort nachbar = s.getAndererOrt(kandidat);

				nachbar.setEntfernung(kandidat.getEntfernung() + s.getLaenge(), kandidat);
				System.out.println("Nachbar: " + nachbar.getName());
				
				kandidaten.add(nachbar);
				
				s.setErledigt(true);
			} // for strasse
			
			System.out.println();
		} // while kandidaten

	} // navigiere

}
