/**
 * 
 */
package parser;

import java.util.LinkedHashMap;
import java.util.Scanner;

import types.*;


/**
 * @author Giorgio Ravera
 *
 */
public class Parser 
{
	private Scanner read = new Scanner(System.in);
	private LinkedHashMap<String, Symbol> dictionary = new LinkedHashMap<String,Symbol>();
	
	/**
	 * Costruttore: inizializza il dizionario
	 *
	 */
	public Parser()
	{
		dictionary.put("budino", new Word("budino"));
		dictionary.put("42", new Numero("42"));
		
		dictionary.put("il", new Articolo("il"));
		dictionary.put("lo", new Articolo("lo"));
		dictionary.put("la", new Articolo("la"));
		dictionary.put("i", new Articolo("i"));
		dictionary.put("gli", new Articolo("gli"));
		dictionary.put("le", new Articolo("le"));
		dictionary.put("l'", new Articolo("l'"));
		dictionary.put("un", new Articolo("un"));
		dictionary.put("uno", new Articolo("uno"));
		dictionary.put("una", new Articolo("una"));
		dictionary.put("un'", new Articolo("un'"));
	}
	
	/**
	 * Funzione che da il via all'analisi sintattica.<br />Questa viene effettuata una parola alla volta.
	 */
	public void start()
	{
		while(read.hasNext())
		{
			String s = read.next();
			System.out.println(s);
			Symbol sy = dictionary.get(s);
			if(sy!=null)
			{
				System.out.println("Trovato " + sy.getType() + " " + (sy.getClass()).toString());
				// C' quindi so cosa sia.
				// Lo aggiungo alla lista di elaborazione. (DA FARE)
			}
			else
			{
				System.out.println("NON Trovato");
				sy=Numero.castNumber(s);
				if(sy==null)
				{
					sy=Verbo.castVerbo(s);
					if(sy==null)
						sy=find(s);//Cerca su google?
				}
				System.out.println("Trovato " + sy.getType() + " " + (sy.getClass()).toString());
				//I verbi li aggiungo solo all'infinito
				if(sy.getClass()==VerboConiugato.class)
				{
					VerboConiugato v = (VerboConiugato)sy;
					sy = v.getVerbo();
					System.out.println("Metto Infinito");
					//sbatto dentro tutte le coniugazioni prese da sito assurdo
					s = ((Verbo)sy).getValore();
					if(dictionary.containsKey(s))
						break;
				}
				System.out.print("Aggiungo!!");
				dictionary.put(s, sy);
			}
		}
	}
	/*
	 * Cerca su google o similari che cosa sia il simbolo appena rilevato che non appartiene al proprio dizionario.
	 */
	private Symbol find(String s)
	{
		//cerca su google e ottiene un id;
		int id=1;
		Symbol simbolo = null;
		switch(id)
		{
			case 1:
			{
				simbolo = new Word(s);
				break;
			}
			/*
			 case 6:
			{
				simbolo = new Numero(s);
				break;
			}
			*/
		}

		return simbolo;
	}
}