/**
 * 
 */
package types;

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

/**
 * @author   Giorgio Ravera
 */
public class Frase
{
	/**
	 * @uml.property  name="frase"
	 */
	private List<Symbol> frase;
	private List<Symbol> soggetto;
	private VerboConiugato verbo;
	private List<Symbol> oggetto;
	private boolean other=false;
	
	public Frase(List<Symbol> f, List<Symbol> s, VerboConiugato v, List<Symbol> o)
	{
		soggetto=s;
		verbo=v;
		oggetto=o;
		frase = f;
		if(
				frase.size()>3 ||
				(frase.size()>2) && !frase.contains(s) ||
				(frase.size()>2 && oggetto==null) ||
				(frase.size()>1 && oggetto==null && !frase.contains(s))
				
			)
			other=true;
		else 
			other=false;
	}
	
	/**
	 * @return
	 * @uml.property  name="soggetto"
	 */
	public List<Symbol> getSoggetto() { return soggetto; }
	/**
	 * @return
	 * @uml.property  name="verbo"
	 */
	public Symbol getVerbo() { return verbo; }
	/**
	 * @return
	 * @uml.property  name="oggetto"
	 */
	public List<Symbol> getOggetto() { return oggetto; }
	/**
	 * @return
	 * @uml.property  name="frase"
	 */
	public List<Symbol> getFrase() { return frase; }
	
	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 str1 = new String();
		String str2 = new String();
		String str3 = new String();
		Symbol s = null;
		
		ListIterator<Symbol> li = (ListIterator<Symbol>) soggetto.iterator();
		str1 = new String("Soggetto: ");
		while(li.hasNext())
		{
			s = li.next();
			str1.concat(s.getValore() + " ");
		}
		
		if(verbo!=null)
			str2 = new String("Verbo: " + verbo.getValore() + " " + verbo.getPersona() + " ");

		li = (ListIterator<Symbol>)oggetto.iterator();
		str1 = new String("Oggetto: ");
		
		while(li.hasNext())
			str1.concat(li.next().getValore() + " ");
		
		return str1.concat(str2.concat(str3.concat("Altro: " + this.other)));
	}
}