package pt_code;

import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * @version 2016-11-5
 * @author Jakub Vata
 *
 */
public class CompTrie {

	/**
	 * Metoda komprimující trii 
	 * @param next koøen trii, kterou chceme zkomprimovat
	 */
	public static void comp(Map<String, Item> next) {
		
		if (next == null) {
			return;
		}
			
		Item it;
		Map<String, Item> cont;
		
		for (String st : new TreeSet<String>(next.keySet())) {
			
			it = next.get(st);
			
			if (it == null) {
				return; 
			}
			
			cont = it.getNext();
			
			if (cont != null && cont.size() == 1 && it.getIndexD() == -1) {
				
				String nasl = ((TreeMap<String, Item>) cont).firstKey();
				next.remove(st);
				st += nasl;
				//System.out.println(st);
				
				next.put(st, cont.get(nasl));
				
				comp(next);
				
			}
			else {
				comp(cont);
			}
		}	
	}
	
	/**
	 * Metoda vypisující komprimovanou trii od zadaného uzlu (standartnì koøen)
	 * @param temp uzel od ktereho chceme trii vypsat
	 */
	public static void print(Map<String, Item> temp) {
			
		if(temp == null) {
			return;
		}
			
		for(String key: temp.keySet()) {
			Item i = temp.get(key);
			System.out.print(key + " ");
			if(i.getIndexD() != -1) {
				System.out.println(i.getIndexD());
			}
			print(i.getNext());
		}
	}
	
	/**
	 * Metoda hledající slovo v komp. trii
	 * @param word hledané slovo
	 * @param next koøen komp. trie v které hledáme
	 * @return index slova ve slovníku, pokud není v trii -1
	 */
	public static int findWord(String word, Map<String, Item> next) {
		
		int result = -1;
		
		for(String s : next.keySet()) {
			if (word.length() >= s.length() && s.equalsIgnoreCase(word.substring(0, s.length()))) {
				if (s.length() == word.length()) {
					result = next.get(s).getIndexD();
					return result;
				}
				else {
					result = findWord(word.substring(s.length()), next.get(s).getNext());
				}
			}
		}
		
		return result;
	}
}
