package de.dass_it.vanhelsing.gui;

import javax.faces.event.ActionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import de.dass_it.www.vanhelsing.VanHelsingStub.*;
import de.dass_it.vanhelsing.gui.items.ConcreteUserObjectItem;
import javax.faces.context.FacesContext;

/**
 * JobSchedule will list all schedules and the jobs which are associated 
 * with a given schedule.
 */
public class JobScheduleBean  {
	private DataTree dataTree;
	private ConcreteUserObjectItem selectedObject;
	public JobScheduleBean(){
		init();
	}
	/**
	 * creates a data tree for the job / schedule view
	 */
	private void init(){
		Client c = new Client();
		UserObjectItemFactory UOFactory = new UserObjectItemFactory();
		ResourceInfo riSched[];
		ResourceInfo riJobs[];
		SimpleResource sr;
		DefaultMutableTreeNode parent;
		dataTree = new DataTree();
		dataTree.setTree("JobSchedule");
		riSched = c.getListResources(BeanUtil.getProperty("defaultdirector"), "Schedule");
		for (ResourceInfo rinfo : riSched){
			parent = dataTree.createNode(dataTree.getRoot(), 
					UOFactory.createUserObjectItem(rinfo));
			riJobs = c.getListResources(rinfo.getDirector(), "Job");
			for (ResourceInfo rJobs : riJobs){
				sr = c.getSimpleResource(rJobs.getDirector(), rJobs.getResId());
				for (ResourceAttributeType rat : sr.getResourceAttributeType()){
					if (rat.getKey().toLowerCase().equals("schedule") &&
						rat.getValue().equals(rinfo.getResName())){	
						dataTree.createNode(parent, 
								UOFactory.createUserObjectItem(rJobs));
					}
				}
			}
		}
	}
	
	/**
	 * creates a new node in the data tree
	 * @param ae	ActionEvent parameter as required by JSF. Not used by this method
	 */
	public void createNodeListener(ActionEvent ae){
		//Methode kann nur mit ausgewählten ParentNode ausgeführt werden
		DefaultMutableTreeNode parent = dataTree.getNodeByName("horst");
		UserObjectItemFactory UOFactory = new UserObjectItemFactory();
		
	}
	/**
	 * updates the selected node of the data tree
	 * @param ae	ActionEvent parameter as required by JSF. Not used by this method
	 */
	public void updateNodeListener(ActionEvent ae){
		BeanUtil.setInfoMessage(null, "Die Methode ist noch nicht implementiert");
		
	}
	/**
	 * delete the selected node of the data tree
	 * @param ae
	 */
	public void deleteNodeListener(ActionEvent ae){
		DefaultMutableTreeNode node;
		ae.getComponent().getAttributes();

		String idString = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("UserObject.resId");
		String name = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("UserObject.resName");
		
		if (idString == null && name != null && !name.equals("")){
			node = dataTree.getNodeByName(name);
			try{
				node = dataTree.deleteNode(node);
			}catch (ConstraintViolationException ecv){
				System.err.println(ecv.toString());
			}
		} else if (idString != null) {
			node = dataTree.getNodeById(new Integer(idString).intValue());
			try {
				node = dataTree.deleteNode(node);
			} catch (ConstraintViolationException ecv) {
				ecv.printStackTrace();
			}
		} else {
			BeanUtil.setInfoMessage(null, "Knoten kann nicht referenziert werden");
		}
		dataTree.getTree().reload();
	}
	/**
	 * rebuilds the data tree
	 * @param ae	ActionEvent parameter as required by JSF. Not used by this method
	 */
	public void reloadTreeListener(ActionEvent ae){
		init();
	}
	public void selectNode(ActionEvent ae){
		//BeanUtil.setInfoMessage(null, "Die Methode ist noch nicht implementiert");
		
	}
	/**
	 * getter method for the dataTree attribute
	 * @return dataTree		returns the dataTree object. If you want to user Javas tree methods directly
	 */
	public DataTree getDataTree(){
		return dataTree;
	}
	/**
	 * setter method for the dataTree attribute.
	 * @param dataTree	the new dataTree object
	 */
	public void setDataTree(DataTree dataTree){
		this.dataTree = dataTree;
	}
}
