
package hu.swankey.ammo.common.yggdrasil;

import hu.swankey.ammo.common.yggdrasil.basics.ComplexObject;
import hu.swankey.ammo.common.yggdrasil.basics.YObject;

import java.util.HashMap;
import hu.swankey.logging.LoggerInitialiser;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author solusa
 */
public class Finder {
    
    /** Az útvonalakhoz tartozó elemek */
    private HashMap<String, YObject> elements = new HashMap<String, YObject>();
    
    /** Az elemekhez tartozó útvonalak */
    private HashMap<YObject, String> paths = new HashMap<YObject, String>();
    
    public Finder() {
        LoggerInitialiser.initLog(this.getClass().getName());
    }
    
    /** Register new element */
    public String register(YObject element) {

        Logger.getLogger(this.getClass().getName()).log(Level.FINE,
                "Register: '" + element.getPathString() + "' (" + element.getYClass() + ")");

        if (element == null)
            throw new RuntimeException("Null-element cannot be registered");     
        
        if (element.getName() == null)
            throw new RuntimeException("Name cannot be null");
        
        if (element.getContainer() != null && !paths.containsKey(element.getContainer())) 
            throw new RuntimeException("Parent is not registered: " + element.getContainer());
            
        
        // Path of the new element:
        String path = element.getPathString();
        
        // Check: Every element can be registered only once:
        //if (paths.containsKey(element))
        //    throw new RuntimeException("Element is already registered as '" + paths.get(element) + "'");
        
        // Check: The path must be unique:
        if (elements.containsKey(path))
            throw new RuntimeException("The path is already exists: " + path);
                
        // Register:
        elements.put(path, element);
        paths.put(element, path);

        //Logger.getLogger(this.getClass().getName()).log(Level.FINE,"Register: '" +  path + "'");
        
        // Register sub-elements:
        //if (element instanceof Container) {
        //    for (IElement subelement : ((Container)element).getElements()){
        //        register(subelement);
        //    }
        //}
        
        return path;
    }
    
    
    /** Remove deleted element */
    public YObject unregister(YObject element) {

        if (element == null)
            throw new RuntimeException("'element' cannot be null.");

        if (!paths.containsKey(element))
            throw new RuntimeException("\"" + element.getPathString() + "\" is not registered");

        String path = paths.get(element);
        paths.remove(element);
        elements.remove(path);

        return element;
    }
    
    
    /** Returns a path to an element */
    public String getPath(YObject element){
    	throw new UnsupportedOperationException("Finder nincs karbantartva!");
        //return paths.get(element);
    }
    
    /** Returns the element on the end of the given path */
    public YObject get(String path){
    	throw new UnsupportedOperationException("Finder nincs karbantartva!");
        //return elements.get(path);
    }
    
    public ComplexObject getRoot(){
    	throw new UnsupportedOperationException("Finder nincs karbantartva!");
        //return (Complex) elements.get(Element.DELIMITER);
    }
    
    public int size(){
        return elements.size();
    }

    public boolean contains(YObject element){
    	throw new UnsupportedOperationException("Finder nincs karbantartva!");
        //return elements.containsValue(element);
    }
}
