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

import hu.swankey.ammo.common.yggdrasil.basics.ComplexYObject;
import hu.swankey.ammo.common.yggdrasil.basics.StringField;
import hu.swankey.ammo.common.yggdrasil.basics.YContainer;
import hu.swankey.ammo.common.yggdrasil.definition.VariableDefinition;

public class Universe extends ComplexYObject {

    public static final String KEY_COMMANDS = "commands";
    public static final String KEY_WORLDS = "worlds";
    public static final String KEY_DESCRIPTION = "desc";

    protected Universe(String name, ComplexYClass type) {
        super(name, type);
    }

    public YContainer getWorlds() {
        return (YContainer) get(KEY_WORLDS);
    }

    public void addCommand(Command command) {
        ((YContainer) get(KEY_COMMANDS)).put(command);
    }

    public YContainer getCommandContainer() {
        return (YContainer) get(KEY_COMMANDS);
    }

    public void addWorld(World world) {
        ((YContainer) get(KEY_WORLDS)).put(world);
    }


    public static UniverseClass yclass() {
        return UniverseClass.singleton();
    }

    @Override
    public UniverseClass getYClass() {
        return (UniverseClass) super.getYClass();
    }

    public static class UniverseClass extends ComplexYClass {

        private static final String CLASS_NAME = "Universe";
        private static UniverseClass singleton;

        public static UniverseClass singleton() {

            if (singleton == null) {
                singleton = new UniverseClass(CLASS_NAME);
                singleton.addElement(VariableDefinition.yclass().create(
                        KEY_WORLDS,
                        ContainerClass.getContainerClass(World.yclass()),
                        null));
                singleton.addElement(VariableDefinition.yclass().create(
                        KEY_COMMANDS,
                        ContainerClass.getContainerClass(Command.yclass()),
                        null));
                singleton.addElement(VariableDefinition.yclass().create(
                        KEY_DESCRIPTION,
                        StringField.yclass(),
                        null));
                placeClass(singleton);
            }

            return singleton;
        }

        protected UniverseClass(String name) {
            super(name, null);
        }

        @Override
        public Universe create(String name) {
            Universe newUniverse = new Universe(name, this);
            init(newUniverse);
            return newUniverse;
        }

    }

}
