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

import hu.swankey.ammo.common.yggdrasil.basics.ComplexYObject;
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 Command extends ComplexYObject {
	
	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 Command(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;
    	}
    	
	}

}

