/**
 * 
 */
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()
	{
		while(read.hasNext())
		{
		}
	}
	
	public Symbol nextSymbol()
	{
		String s = null;
		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);
						// Se non trova potrebbe essere verbo						
						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());
								// AGGIUNGERE TERZA FORMA: SONO STATO MANGIATO
							}
							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))
				{
					System.out.println("Metto Infinito");
				}
			}
			else
			{
				System.out.print("Aggiungo!!");
				dictionary.put(s, sy);
			}
		}
		return 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;
	}
}