/**
 * 
 */
package types;

import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

/**
 * @author Giorgio Ravera
 *
 */
public class Verbo extends Symbol
{
	protected String infinito;
	//lista di coniugazioni
	//lista totale verbi (server per il riconoscimento statico)
	protected static List<Verbo> elenco = new LinkedList<Verbo>();
	protected static Map<String, VerboConiugato> verbi = new LinkedHashMap<String, VerboConiugato>();
	
	/**
	 * Costruttore di default.<br />Associa una stringa a un tipo di simbolo.
	 */
	public Verbo(String s) 
	{
		super(Type.verbo);
		infinito = s;
		elenco.add(this);
	}
	
	public boolean equals(Object o)
	{
		if(super.equals(o))
		{
			Verbo v = (Verbo)o;
			return this.infinito.equals(v.infinito);
		}
		else return false;
	}
	
	/**
	 * Funzione che ricerca se una particolare forma di coniugazione del verbo  gi stata incontrata
	 * 
	 * @return VerboConiugato istanza di VerboConiugato se la stringa  gi in memoria, null se non  presente.
	 */
	public static VerboConiugato find(String s)
	{
		return verbi.get(s);
	}
	
	public VerboConiugato addVerboConiugato(String s, int t, int p)
	{
		VerboConiugato v = new VerboConiugato(s,t,p,this);
		verbi.put(s, v);
		return v;
	}	
	
	/**
	 * Consente di identificare tempo e persona di una forma verbale
	 * 
	 * @param s Stringa da esaminare 
	 * @return Vettore che contiene la base del verbo, tempo e persona.
	 */
	public static String[] discoverTP(String s)
	{
		String tp[] = new String[3];

		if(s.endsWith("o"))
		{
			tp[0] = s.substring(0, s.length()-1);
			tp[1] = new String(new Integer(TempoVerbale.presente).toString());
			tp[2] = new String(new Integer(Persona.io).toString());
			
		}
		else if(s.endsWith("i"))
		{
			tp[0] = s.substring(0, s.length()-1);
			tp[1] = new String(new Integer(TempoVerbale.presente).toString());
			tp[2] = new String(new Integer(Persona.tu).toString());
			
		}
		else if(s.endsWith("a")|| s.endsWith("e"))
		{		
			tp[0] = s.substring(0, s.length()-1);
			tp[1] = new String(new Integer(TempoVerbale.presente).toString());
			tp[2] = new String(new Integer(Persona.egli).toString());
		}
		
		else if(s.endsWith("ato") || s.endsWith("unto") || s.endsWith("uto") || s.endsWith("ito"))

		else 
		{
			return null;
		}
		
		return tp;
	}	
	
	public static Symbol castVerbo(String s)
	{
		if(s.endsWith("are")||s.endsWith("ere") || s.endsWith("ire"))
			return new Verbo(s);
		VerboConiugato vc = verbi.get(s);
		if(vc!= null)
		{
			System.out.println("Gi coniugato");
			return vc;
		}
		
		//Identifica la stringa iniziale del verbo: MANGIo -> MANGIare, tempo e persona
		String[] block = discoverTP(s);
		if(block == null)
		{
			return null;
		}
		
		// Pssa in rassegna tutti i verbi nell'archivio e verifica se quello trovato pu appartenere a uno di loro.
		// Se pu appartenere verifica se tra le coniugazioni esisteni c'.  
		ListIterator<Verbo> iter = (ListIterator<Verbo>) elenco.iterator();
		while(iter.hasNext())
		{
			Verbo current = iter.next();			
			if(current.infinito.startsWith(block[0]))
			{
				System.out.println("Ho trovato!!!! Mitico");
				vc = current.addVerboConiugato(s,Integer.parseInt(block[1]), Integer.parseInt(block[2]));
			}
		}
		
		return vc;
	}
	
	/**
	 * Ritorna la stringa corrispondente alla fomra infinita del verbo
	 * 
	 * @return String Forma infinita del verbo
	 */
	public String getValore()
	{
		return this.infinito;
	}
}