/**
 * 
 */
package types;

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

/**
 * @author Giorgio Ravera
 *
 */
public class Frase
{
	private Symbol soggetto;
	private VerboConiugato verbo;
	private Symbol oggetto;
	
	public Frase(Symbol s, VerboConiugato v, Symbol o)
	{
		soggetto=s;
		verbo=v;
		oggetto=o; 
	}
	
	public Frase(List<Symbol> l)
	{
		Symbol s= null;
		List<Symbol> pre_verbo = new LinkedList<Symbol>();
		List<Symbol> post_verbo = new LinkedList<Symbol>();
		
		// Cerca il verbo
		ListIterator<Symbol> li = (ListIterator<Symbol>) l.iterator();
		while(li.hasNext())
		{
			s = li.next();
			if(s.getType()==Type.verbo && verbo == null)
			{
				li.remove();
				verbo = (VerboConiugato)s;
				//System.out.println("trovato verbo: "+ verbo.getValore() + " " + verbo.getPersona());
				continue;
			}
			if(verbo==null)
				pre_verbo.add(s);
			else
				post_verbo.add(s);
		}
		
		// Cerca il soggetto o oggetto.
		li = (ListIterator<Symbol>) l.iterator();
		while(li.hasNext())
		{
			s = li.next();
			if(s.getType()==Type.pronome)
			{
				Pronome p = (Pronome)s;
				if(p.getPersona()==verbo.getPersona() && !p.isPassive())
				{
					//System.out.println("trovato soggetto: "+ s.getValore());
					soggetto = p;
					li.remove();
				}
				if(p.isPassive())
				{
					//System.out.println("trovato oggetto: "+ s.getValore());
					oggetto = p;
					li.remove();
				}
			}
		}
		
		
			
		if(l.size()!=0)
		{
			// se non c' il soggetto vuol dire che  di terza persona. itero fino al verbo e se trovo parola quella  soggetto.
			if(soggetto==null)
			{
				li = (ListIterator<Symbol>) pre_verbo.iterator();
				while(li.hasNext())
				{
					s=li.next();
					if(s.getType()==Type.parola)
					{
						soggetto = s;
						l.remove(s);
					}
				}
			}
			
			// se non c' l'oggetto la prima parola  l'oggetto.
			if(oggetto==null)
			{
				li = (ListIterator<Symbol>) post_verbo.iterator();
				while(li.hasNext())
				{
					s=li.next();
					System.out.println(s.getValore());
					if(s.getType()==Type.parola)
					{
						oggetto = s;
						l.remove(s);
					}
				}
			}
		}
		else
		{
			//calcolo soggetto da verbo
		}
		if(l.size()!=0)
		{
			System.out.println("altra roba che non capisco nella frase, me ne fotto");
			// se non c' ancora il soggetto lo ricavo dal verbo.
		}
		
		System.out.println("Ok, ho capito");
		System.out.println("prima di verbo: " + pre_verbo.size());
		System.out.println("dopo di verbo: " + post_verbo.size());

		
		l.clear();
	}
	
	public Symbol getSoggetto() { return soggetto; }
	public Symbol getVergo() { return verbo; }
	public Symbol getOggetto() { return oggetto; }
	
	public boolean equals(Object o)
	{
		if(o==null || !(o instanceof Symbol))
			return false;
		else if(o == this)
			return true;
		else
		{
			Frase f = (Frase)o;
			return (f.soggetto.equals(this.soggetto) && f.verbo.equals(this.verbo) && f.oggetto.equals(this.oggetto));
		}
	}
	
	public String toString()
	{
		String str = new String();
		if(verbo!=null)
		{
			str.concat(new String("Verbo: " + verbo.getValore() + " " + verbo.getPersona());
		}
		if(soggetto!=null)
			str.concat(new String("Soggetto: " + soggetto.getValore()));
		if(oggetto!=null)
			str.concat(new String("Oggetto: " + oggetto.getValore()));
		return str;
	}
}
