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

import hu.swankey.ammo.common.yggdrasil.basics.ComplexObject;
import hu.swankey.ammo.common.yggdrasil.basics.Reference;
import hu.swankey.ammo.common.yggdrasil.basics.StringField;
import hu.swankey.ammo.common.yggdrasil.basics.YObject;
import hu.swankey.ammo.common.yggdrasil.definition.VariableDefinition;


public class FieldObject extends ComplexObject {
    
    public static final String KEY_TITLE = "title";
    public static final String KEY_COMMAND = "command";
    public static final String KEY_PRIMARY = "primarySelection";
    public static final String KEY_SECONDARY = "secondarySelection";
    
    protected FieldObject(String name, ComplexClass type) {
        super(name, type);
    }   
    
    public void setTitle(String newTitle){
        set(KEY_TITLE, newTitle);
    }
    
    public String getTitle(){
        return getStringField(KEY_TITLE).getValue();
    }
    
    public void setCommand(String newCommand){
        set(KEY_COMMAND, newCommand);
    }
    
    public String getCommand(){
        return getStringField(KEY_COMMAND).getValue();
    }
    
    public void setPrimaryClass(String newTargetClass){
        set(KEY_PRIMARY, newTargetClass);
    }
    
    public Reference getPrimaryClass(){
        return (Reference) get(KEY_PRIMARY);
    }
    
    public void setSecondaryClass(String newTargetClass){
        set(KEY_SECONDARY, newTargetClass);
    }
    
    public Reference getSecondaryClass(){
        return (Reference) get(KEY_SECONDARY);
    }
    
    public static CommandClass yclass() {
        return CommandClass.singleton();
    }
    
    @Override
    public CommandClass getYClass(){
        return (CommandClass) super.getYClass();
    }

    public static class CommandClass extends ComplexClass {

        private static final String CLASS_NAME = "Command";
        private static CommandClass singleton;
        
        public static CommandClass singleton() {
            
            if (singleton == null){
                singleton = new CommandClass(CLASS_NAME);
                singleton.addElement( VariableDefinition.yclass().create(KEY_COMMAND, StringField.yclass(),  null));
                singleton.addElement( VariableDefinition.yclass().create(KEY_PRIMARY, Reference.yclass(),  new Reference(YObject.yclass().getPathString())));
                singleton.addElement( VariableDefinition.yclass().create(KEY_SECONDARY, Reference.yclass(),  new Reference(YObject.yclass().getPathString())));
                singleton.addElement( VariableDefinition.yclass().create(KEY_TITLE, StringField.yclass(),  null));
            }
            
            return singleton;
        }
        
        protected CommandClass(String name) {
            super(name, null);
        }
        
        
        @Override
        public Command create(String name) {
            Command newCommand = new Command(name, this);
            init(newCommand);
            return newCommand;
        }
        
        public Command create(String title, String command, String primary, String secondary){
            String name = title.replaceAll(" ", "_");           
            Command cmd = new Command(name, this);          
            init(cmd);
            
            if (primary != null)
                cmd.setPrimaryClass(primary);
            
            if (secondary != null)
                cmd.setSecondaryClass(secondary);
            
            cmd.setTitle(title);
            cmd.setCommand(command);
            
            return cmd;
        }
        
    }

}

