package ui.controller;

import java.util.HashMap;
import java.util.Map.Entry;

import classes.Category;
import classes.CpsObject;
import classes.HolonElement;
import classes.HolonObject;
import ui.model.Model;

public class MultiPurposeController {

	private Model MODEL;

	public MultiPurposeController(Model model) {
		this.MODEL = model;

	}

	/**
	 * search for category
	 * 
	 * @param name
	 * @return
	 */
	public Category searchCategory(String category) {

		Integer idx;

		if ((idx = MODEL.getCgIdx().get(category)) == null || MODEL.getCgIdx().size() < 1 )
			return null;
		else
			return MODEL.getCategories().get(idx);
	}

	/**
	 * Search for Object
	 * 
	 * @param object
	 * @param list
	 * @return
	 */
	public CpsObject searchCategoryObject(Category category, String object) {

		Integer idx;

		if ((idx = category.getObjIdx().get(object)) == null || category.getObjIdx().size() < 1)
			return null;
		else
			return category.getObjects().get(idx);
	}

	/**
	 * Search for Object by ID
	 * 
	 * @param ID
	 * @param list
	 * @return
	 */
	public CpsObject searchByID(int ID) {

		Integer idx;

		if ((idx = MODEL.getCvsObjIdx().get(ID)) == null || MODEL.getCvsObjIdx().size() < 1)
			return null;
		else
			return MODEL.getObjectsOnCanvas().get(idx);
	}

	/**
	 * Search for Element
	 * 
	 * @param object
	 * @param element
	 * @return
	 */
	public HolonElement searchHolonElement(HolonObject object, String element) {

		Integer idx;

		if ((idx = object.getEleIdx().get(element)) == null || object.getEleIdx().size() < 1)
			return null;
		else
			return object.getElements().get(idx);
	}

	/**
	 * Decrement the Indices if a Key as been removed
	 * 
	 * @param key
	 * @param map
	 */
	public <T> void decIdx(T key, HashMap<T, Integer> map) {

		for (Entry<T, Integer> i : map.entrySet()) {
			if (i.getValue() > map.get(key))
				i.setValue(i.getValue() - 1);
		}
	}	

	/**
	 * Copies a HashMap into a new One
	 * 
	 * @param map
	 * @return
	 */
	public static <T, Integer> HashMap<T, Integer> copyHashMap(HashMap<T, Integer> map) {

		HashMap<T, Integer> newMap = new HashMap<>();
		for (Entry<T, Integer> i : map.entrySet()) {
			newMap.put(i.getKey(), i.getValue());
		}
		return newMap;
	}

}