/*
 * Created on Jun 15, 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.Iterator;
import java.util.LinkedList;
import java.util.Map;
import excepciones.ExcepcionPropiedadExistente;

/**
 * @author gas y jpg
 *
 * 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 AgregarPropiedad extends FuncionAbstracta {
	
	public AgregarPropiedad(){}
	
	//Recibe como parámetro un nombre, una descripción, el sistema, el tipo de requerimiento y el tipo de estado		 
	public Object execute(Map m)throws ExcepcionPropiedadExistente  {
		String nombre = (String) m.get(Constants.NOMBRE);
		String descripcion = (String) m.get(Constants.DESCRIPCION);
		Sistema sistema = (Sistema) m.get(Constants.SISTEMA);
		TipoRequerimiento tipoReq = (TipoRequerimiento) m.get(Constants.TIPOREQ); 
		TipoEstado tipoEst = (TipoEstado) m.get(Constants.TIPOESTADO);
		Propiedad propiedad = new Propiedad(nombre, descripcion);
		//chequea que no haya una propiedad con ese nombre a nivel de sistema
		Iterator it=sistema.getPropiedades().iterator();
		while(it.hasNext()){
			Propiedad prop=(Propiedad)it.next();
			if(prop.getNombre().equalsIgnoreCase(propiedad.getNombre())){
				throw new ExcepcionPropiedadExistente("Ya existe una propiedad con ese nombre");
			}
		}
		//Chequea que la propiedad creada sea la primera de ese tipo de requerimiento en ese tipo de estado para determinar
		//si debe crear el objeto TipoReqTipoEstadoPropiedad
		Iterator itEstadosProp = tipoReq.getEstados_propiedades().iterator();
		TipoReqTipoEstadoPropiedad tipoReqTipoEstProp = null;
		boolean primera = true;
		while ((itEstadosProp.hasNext()) && primera) {
			tipoReqTipoEstProp = (TipoReqTipoEstadoPropiedad) itEstadosProp.next();
			if (tipoReqTipoEstProp.equals(tipoEst)) {
				primera=false;
			}
		}
		if (primera) {
			tipoReqTipoEstProp = new TipoReqTipoEstadoPropiedad(new LinkedList(), tipoEst);	
		}
		tipoReqTipoEstProp.addPropiedad(propiedad);
		tipoReq.addTipoReqTipoEstadoPropiedad(tipoReqTipoEstProp);
		sistema.addPropiedad(propiedad);
		return propiedad;
	}

}