/*
 * Created on 12/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;
import java.util.Map;

import excepciones.ExcepcionUsuarioNoRolLider;


/**
 * @author jpg y gas
 *
 * 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 AgregarProyecto extends FuncionAbstracta {

	public AgregarProyecto(){}
	
//Por parametro viene: Nombre, Descripcion, Lider y Sistema
	public Object execute(Map m) throws ExcepcionUsuarioNoRolLider {
		String nombre = (String) m.get(Constants.NOMBRE);
		String desc = (String) m.get(Constants.DESCRIPCION);
		Usuario usuario = (Usuario) m.get(Constants.USUARIO);
		Sistema sist = (Sistema) m.get(Constants.SISTEMA);
		//Verifica si el usuario que viene como parámetro puede cumplir el rol de lider de proyecto
		Collection rolesUsuario = usuario.getRoles();
		boolean lider = false;
		Iterator itRolesUsr = rolesUsuario.iterator();
		Rol r = null;
		while ( (itRolesUsr.hasNext()) && !lider ) {
			r =  (Rol) itRolesUsr.next();
			if (r.getNombre().equals(Constants.LIDER)) {
						lider = true;				
			}
		}		
		if (!lider) {
			throw new ExcepcionUsuarioNoRolLider("El usuario no puede desempeñar el rol de lider de proyecto"); 
		}
		Date fechaHoy = new Date();
		List usuarios = new LinkedList();
		usuarios.add(usuario);
		//Crea un nuevo RolMiembros que será el objeto que vincule el rol de "lider de proyecto" del sistema con el usuario que viene
		//como parámetro y que será el lider del proyecto a crearse
		RolMiembros rolMiembros = new RolMiembros(usuarios, r);
		Collection tiposEstados = (Collection) sist.getTiposEstados();
		//Busca el tipo de Estado Creado, para crear el workflow a nivel de proyecto, que siempre estará presente porque se
		//carga automáticamente al crearse el sistema (funcion del "superusuario")	
		boolean found = false;
		Iterator itTiposEstados = tiposEstados.iterator();
		TipoEstado te = null;
		while ( (itTiposEstados.hasNext()) && !found ) {
				te=  (TipoEstado) itTiposEstados.next();
				if (te.getNombre().equals(Constants.CREADO)) {
							found = true;				
				}
		}

		//Crea la mínima configuración de nodos que puede tener un proyecto, es decir, un NodoCompuesto que representa el 
		//estado de creado y un NodoFinal que representa el estado de finalizado 
		//Crea el nodo inicial del workflow
		NodoCompuesto nodo_inicial= new NodoCompuesto(te, new LinkedList(), new LinkedList());
		//Busca el tipo de Estado Finalizado que siempre estará presente porque se carga automáticamente al crearse el 
		//sistema (funcion del "superusuario")	
		tiposEstados = sist.getTiposEstados();
		te = null;
		found = false;
		itTiposEstados = tiposEstados.iterator();
		while ( (itTiposEstados.hasNext()) && !found ) {
			te=  (TipoEstado) itTiposEstados.next();
			if (te.getNombre().equals(Constants.FINALIZADO)) {
								  found = true;				
			}
		}
		//Crea el nodo final del workflow 
		NodoFinal nodo_final = new NodoFinal(te,new LinkedList()); 
		/*Crea el proyecto con los datos iniciales, esto es nombre, fecha de creación
 		 * el usuario que va a tener el rol de lider en el proyecto, y el nodo incial del workflow
		 * que va a estar en el estado creado. Asi nos aseguramos que todo proyacto que se cree 
 		 * va a tener como nodo inicial al estado creado
 		 */
		//public Proyecto (String nombre, String descripcion, Date fechaCreacion, Collection tiposRequerimiento, 
		//Collection rolesMiembros, Collection requerimientos, NodoCompuesto workflow, Collection nodosCreados)
		Proyecto project = new Proyecto (nombre, desc, fechaHoy, new LinkedList(), new LinkedList(), new LinkedList(), 
		nodo_inicial, new LinkedList());
		project.addRolMiembros(rolMiembros);
		project.addNodoCreado(nodo_final);
		project.addNodoCreado(nodo_inicial);
		//Agrega el proyecto creado al sistema	
		sist.addProyecto(project);
		return project;
 }
		
}
