/**
 * 
 */
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>();
	private Verbo avere = new Verbo("avere");
	private Verbo essere = new Verbo("essere");
	
	/**
	 * 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'"));
		
		dictionary.put("avere", avere);
		avere.addVerboConiugato("ho", TempoVerbale.presente, Persona.io);
		avere.addVerboConiugato("hai", TempoVerbale.presente, Persona.tu);
		avere.addVerboConiugato("ha", TempoVerbale.presente, Persona.egli);
		avere.addVerboConiugato("abbiamo", TempoVerbale.presente, Persona.noi);
		avere.addVerboConiugato("avete", TempoVerbale.presente, Persona.voi);
		avere.addVerboConiugato("hanno", TempoVerbale.presente, Persona.essi);

		dictionary.put("essere", essere);
		essere.addVerboConiugato("sono", TempoVerbale.presente, Persona.io);
		essere.addVerboConiugato("sei", TempoVerbale.presente, Persona.tu);
		essere.addVerboConiugato("", TempoVerbale.presente, Persona.egli);
		essere.addVerboConiugato("siamo", TempoVerbale.presente, Persona.noi);
		essere.addVerboConiugato("siete", TempoVerbale.presente, Persona.voi);
		essere.addVerboConiugato("sono", TempoVerbale.presente, Persona.essi);
		
	}
	
	/**
	 * Funzione che da il via all'analisi sintattica.<br />Questa viene effettuata una parola alla volta.
	 */
	public void start()
	{
		String s = null;
		while(read.hasNext())
		{
			s = read.next();
			System.out.println(s);
			
			//usato per essere e avere
			VerboConiugato Temp = null;
			
			Symbol sy = dictionary.get(s);
			if(sy!=null)
			{
				System.out.println("Trovato " + sy.getType() + " " + (sy.getClass()).toString());
				// C' quindi so cosa sia.
			}

			if(sy==null)
			{
				System.out.println("Non in memoria principale");
				sy=Verbo.castVerbo(s);
				if(sy!=null)
				{
					if(sy.getClass().equals(VerboConiugato.class))
					{
						if(((VerboConiugato)sy).getVerbo().equals(essere) || ((VerboConiugato)sy).getVerbo().equals(avere))
						{
							System.out.println("Deriva da essere o avere");
							Temp = (VerboConiugato) sy;
							s = read.next();
							sy = dictionary.get(s);
														
							if(sy==null)
							{
								sy=Verbo.castVerbo(s);
								if(sy!=null && ((VerboConiugato)sy).getPersona()==Persona.nussuna)
								{
									System.out.println("ho vinto  un verbo");
									VerboConiugato vc = (VerboConiugato)sy;
									sy = vc.getVerbo().addVerboConiugato(Temp.getValore() + " " + vc.getValore(), Temp.getTempo(),Temp.getPersona());
									vc = (VerboConiugato)sy;
									System.out.println(vc.getValore() + " " + vc.getTempo() + " " + vc.getPersona());
								}
								else
								{
									System.out.println("aggiungo in lista Temp e procedo perch so che non  un verbo oppure  un altro");
								}
							}
							// Se lo trova allora si sa che non  un verbo
							else
							{
								System.out.println("aggiungo in lista Temp e procedo perch so che non  un verbo.");
							}
						}
					}
				}
				if(sy==null)
				{
					sy=Numero.castNumber(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();
					//sbatto dentro tutte le coniugazioni prese da sito assurdo
					s = ((Verbo)sy).getValore();
					if(dictionary.containsKey(s))
						continue;
					else
						System.out.println("Metto Infinito");
				}
				else
				{
					System.out.print("Aggiungo!!");
					dictionary.put(s, sy);
				}
			}
			// Lo aggiungo alla lista di elaborazione. (DA FARE)
		}
	}
	/*
	 * 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;
	}
}