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



public class DatabaseVerbi 
{
	private static DatabaseVerbi theInstance;
	
	//campi privati
	protected List<Verbo> elenco = new LinkedList<Verbo>();
	protected Map<String, VerboConiugato> verbi = new LinkedHashMap<String, VerboConiugato>();

	
	private DatabaseVerbi(){
		
		//costruttore con inizializzaione
	}
	
	public static DatabaseVerbi getInstance()
	{
		if (theInstance == null) {
			
			theInstance = new DatabaseVerbi();
		}
		return theInstance;
	}
	
	public void addInfinito(Verbo v)
	{
		elenco.add(v);
	}
	
	public void addConiugato(String s, VerboConiugato v)
	{
		verbi.put(s, v);
	}

	public VerboConiugato getConiugato(String s)
	{
		return verbi.get(s);
	}

	public VerboConiugato find(String s)
	{
		return verbi.get(s);
	}
	
	public Symbol castVerbo(String s)
	{
		Symbol simbolo = find(s);
		if(simbolo != null)
		{
			System.out.println("C'era gi!!! Mitico!!!");
			return simbolo;
		}
		
		if(s.endsWith("are")||s.endsWith("ere") || s.endsWith("ire"))
		{
			new Verbo(s);
			return find(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.valore.startsWith(block[0]))
			{
				System.out.println("Ho trovato!!!! Mitico");
				vc = current.addVerboConiugato(s,Integer.parseInt(block[1]), Integer.parseInt(block[2]));
			}
		}
		
		return vc;
	}

}	
