package hu.swankey.ammo.common.yggdrasil.ext;

import hu.swankey.ammo.common.yggdrasil.Yggdrasil;
import hu.swankey.ammo.common.yggdrasil.basics.ComplexYObject;
import hu.swankey.ammo.common.yggdrasil.basics.YContainer;
import hu.swankey.ammo.common.yggdrasil.basics.YObject;
import hu.swankey.ammo.common.yggdrasil.definition.AttributeDefinition;


public class Root extends ComplexYObject {
	
	public static final String KEY_MULTIVERSE = "multiverse";
	
	private Yggdrasil yggdrasil;
	
	protected Root(String name, RootType type) {
		super(name, type);
	}
    
	public static RootType yclass(){
		return RootType.yclass();
	}
	
	public void setYggdrasil(Yggdrasil yggdrasil) {
		this.yggdrasil = yggdrasil;
	}
	
	public YContainer getMultiverse(){
		return (YContainer) get(KEY_MULTIVERSE);
	}
	
	public static class RootType extends ComplexYClass {
		
		private static final String CLASS_NAME = "Root";
		private static RootType singleton;		
		
		public static RootType yclass(){
			if (singleton == null) {
				singleton = new RootType(CLASS_NAME);
				singleton.addElement( AttributeDefinition.yclass().create(Yggdrasil.PACKAGE_ROOT, YContainer.yclass(), null));
				singleton.addElement( AttributeDefinition.yclass().create(KEY_MULTIVERSE, YContainer.yclass(), null));				
			}
			return singleton;
		}
		
		protected RootType(String name) {
			super(name, null);
		}

    	@Override
    	public ComplexYObject create(String name) {
    		Root newRoot = new Root(name, this);
    		init(newRoot);
    		newRoot.replace(Yggdrasil.PACKAGE_ROOT, getRootPackage().getWrapperElement() );
    		return newRoot;
    	}
	    
	    
	    @Override
	    public String getName(){
	        return CLASS_NAME;
	    }
	}	
  
    
	
  
  /** Report a new element beneath this node */
  @Override
  public void reportNewElement(YObject element){
      if (yggdrasil != null)
          yggdrasil.reportNewElement(element);
  }
          
  /** Report a deleted element beneath this node */
  @Override
  public void reportRemovedElement(YObject element, YContainer container, int index){
      yggdrasil.reportDeletedElement(element, container, index);
  }
          
  /** Report a renamed element beneath this node */
  @Override
  public void reportRenamedElement(YObject element, String oldname) {
      yggdrasil.reportRenamedElement(element);
  }        
  
  /** Report a relocated element beneath this node */
  @Override
  public void reportRelocatedElement(YObject element, YContainer oldparent){
      yggdrasil.reportRelocatedElement(element);
  }
          
  /** Report a change in one of the contained elements */
  @Override
  public void reportChangedElement(YObject element){
	  if (yggdrasil != null)
		  yggdrasil.reportChangedElement(element);
  }
}
