/*
 * Created on 11/05/2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package modelo;

import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
 * @author german
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class Estado implements Cloneable{

	public Estado() {
		this(null, null, null, null, null);
	}

	public Estado(RecorridoEstado estadoInicial, Usuario lider, Date fechaHoy) {
		this(estadoInicial, lider, fechaHoy, null, null);
	}
	
	public Estado(RecorridoEstado estado, Usuario usuario, Date fechaDesde, Date fechaHasta, Collection valores) {
		this.setRecorridoEstado(estado);
		this.setResponsable(usuario);
		this.setFecha_desde(fechaDesde);
		this.setFecha_hasta(fechaHasta);
		this.setValores(valores);
	}
			
	protected Date fecha_desde;

	protected Collection valores;

	protected RecorridoEstado recorridoEstado;

	protected Usuario responsable;

	protected Date fecha_hasta;

	public Date getFecha_desde() {
		return fecha_desde;
	}

	public void setFecha_desde(Date fecha_desde) {
		this.fecha_desde = fecha_desde;
	}

	public Date getFecha_hasta() {
		return fecha_hasta;
	}

	public void setFecha_hasta(Date fecha_hasta) {
		this.fecha_hasta = fecha_hasta;
	}

	public Collection getValores() {
		return valores;
	}

	public void setValores(Collection valores) {
		this.valores = valores;
	}

	public RecorridoEstado getRecorridoEstado() {
		return recorridoEstado;
	}

	public void setRecorridoEstado(RecorridoEstado tipoEstado) {
		this.recorridoEstado = tipoEstado;
	}

	public Usuario getResponsable() {
		return responsable;
	}

	public void setResponsable(Usuario responsable) {
		this.responsable = responsable;
	}

	public Collection nextStates() {
		return null;
	}
	
	public void addValor (ValorPropiedad val) {
		this.getValores().add(val);
	}
	
	private Collection cloneValores (Collection valores){
		List clonValores = new LinkedList();
		Iterator it = valores.iterator();
		while (it.hasNext()) {
			clonValores.add(((ValorPropiedad) it.next()).clone());
		}
		return clonValores;
	}
	
	public Estado clonarParaCambioResponsable(Usuario resp){
		Estado clone = null;
		try
		{
			clone = (Estado) super.clone();
		} 
		catch(CloneNotSupportedException e)
		{
			// No deberia suceder
		}
	    clone.setValores(this.cloneValores(this.getValores())); //clona la colección de valores del estado
		clone.setResponsable(resp); //pone como nuevo responsable el usuario recibido como parámetro 
		clone.setFecha_desde(new Date());//guarda la fecha actual como fecha de inicialización del requerimiento en el nuevo estado
		//clonado del anterior
		clone.setFecha_hasta(null);//pone en null la fecha de finalizacion del  requerimiento en el nuevo estado clonado.
		//El RecorridoEstado asignado a "ambos estados" del requerimiento es el mismo (debido a que se cambia de responsable
		//y en se crea un nuevo estado, pero en realidad los dos representan el mismo con distinto responsable, distintas fechas
		//y posiblemente distintos valores), por lo tanto se mantiene la misma referencia para ambos objetos.
		return clone;
	}
	
	public void addValorPropiedad (ValorPropiedad val) {
		this.getValores().add(val);
	}

}
