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

import hu.swankey.ammo.common.progstruct.Method;
import hu.swankey.ammo.common.yggdrasil.YPackage;
import hu.swankey.ammo.common.yggdrasil.YUnit;
import hu.swankey.ammo.common.yggdrasil.basics.StringField;
import hu.swankey.ammo.common.yggdrasil.basics.YObject;

import java.util.Map;

public class PackageDefinition extends ElementDefinition {
	
	protected PackageDefinition(String name, PackageDefinitionClass yclass) {
		super(name, yclass);
	}
	
	public static PackageDefinitionClass yclass(){
		return PackageDefinitionClass.singleton();
	}
	
	public void setWrapped(YPackage ypackage){
		for(YUnit yunit: ypackage.getAllYUnits())
			addYUnit(yunit);
		wrapped = ypackage;
	}
	
	public void addYUnit(YUnit newUnit){
		put( newUnit.getWrapperElement() );
	}
	
	public YPackage getWrapped(){
		return (YPackage)wrapped;
	}
	
	@Override
	public void synchronize() {
		// TODO Auto-generated method stub
		
	}	
	
	public static class PackageDefinitionClass extends ElementDefinitionClass {
		
		private static String CLASS_NAME = "PackageDef";
		private static PackageDefinitionClass singleton;
		
		private static PackageDefinitionClass singleton(){
			if (singleton == null) {
				singleton = new PackageDefinitionClass(CLASS_NAME);
				singleton.addSuperior( ElementDefinition.yclass() );
				singleton.addMethod( AddSuperior.function );
				placeClass(singleton);
			}
			return singleton;
		}

		protected PackageDefinitionClass(String name) {
			super(name, null);
		}
		
    	public PackageDefinition create(YPackage ypackage) {
    		PackageDefinition newDef = create(ypackage.getName());
    		newDef.setWrapped(ypackage);
    		return newDef;
    	}
    	
    	@Override
    	public PackageDefinition create(String name) {
    		PackageDefinition newDef = new PackageDefinition(name, this);
    		init(newDef);
    		return newDef;
    	}
    	
		
	}
	
//	private static class AddSuperior extends Method {
//
//		private static final String FUNCTION_NAME = "newClass";
//		private static final String KEY_NAME = "name";
//		private static final YClass YCLASS_NAME = StringField.yclass();
//
//		public static final AddSuperior function = new AddSuperior();
//
//		protected AddSuperior() {
//			super(FUNCTION_NAME);
//			addParameter(KEY_NAME, YCLASS_NAME, null);
//		}
//
//		@Override
//		public YObject run(Map<String, YObject> params, Map<String, YObject> env, YObject thisElement) {
//			
//			//PackageDefinition thisE = (PackageDefinition)thisElement;
//			
//			String name = ((StringField) params.get(KEY_NAME)).getValue();			
//			ComplexClassDefinition classDef = ComplexClassDefinition.yclass().create(name);
//			
//			return classDef;
//		}
//	}

}
