/**
 * 
 */
package types;

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

/**
 * @author Giorgio Ravera
 *
 */
public class Verbo extends Symbol
{
	protected String infinito;
	//lista di coniugazioni
	protected List<VerboConiugato> coniugazioni = new LinkedList<VerboConiugato>();
	//lista totale verbi (server per il riconoscimento statico)
	protected static List<Verbo> elenco = new LinkedList<Verbo>();

	protected 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).to);
			
		}
		else 
		{
			return null;
		}
		
		return tp;
	}

	
	/**
	 * 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 VerboConiugato find(String s)
	{
		ListIterator<VerboConiugato> iter = coniugazioni.listIterator();
		while(iter.hasNext())
		{
			VerboConiugato current = iter.next();
			if(s.equals(current.valore));
				return current;
		}
		return null;
	}
	
	public VerboConiugato addVerboConiugato(String s, int t, int p)
	{
		VerboConiugato v = new VerboConiugato(s,t,p,this);
		coniugazioni.add(v);
		return v;
	}	
	
	public static Symbol castVerbo(String s)
	{
		StringBuilder sb = new StringBuilder(s);
		
		if(s.endsWith("are")||s.endsWith("ere") || s.endsWith("ire"))
			return new Verbo(s);
		int tempo = 0;
		int persona = 0;
		VerboConiugato vc = null;
		
		
		//Identifica la stringa iniziale del verbo: MANGIo -> MANGIare
		if(s.endsWith("o"))
		{
			tempo = TempoVerbale.presente;
			persona = Persona.io;
			
		}
		else 
		{
			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();
			System.out.println("valore: "+ current.infinito + " " + work);
			
			if(current.infinito.startsWith(work))
			{
				System.out.println("Ho trovato!!!! ma non ancora coniugato");

				vc = current.find(s);
				if(vc!=null)
				{
					System.out.println("Ho trovato!!!! e coniugato");
					break;
				}
				System.out.println("Nulla, lo aggiungo");
				vc = current.addVerboConiugato(s,tempo, persona);
			}
		}
		
		return vc;
	}
	
	/**
	 * Ritorna la stringa corrispondente alla fomra infinita del verbo
	 * 
	 * @return String Forma infinita del verbo
	 */
	public String getValore()
	{
		return this.infinito;
	}
}