package engine.devcmd.cmds;

import engine.Enum.DbObjectType;
import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager;
import engine.objects.*;


/**
 *
 * @author 
 * Dev command to set the owner of targeted building.
 * Argument is a valid guild UID
 */
public class SetOwnerCmd extends AbstractDevCmd {

        Building _targetBuilding = null;
        DbObjectType _newOwnerType;
        AbstractCharacter outOwner;

	public SetOwnerCmd() {
        super("setowner");
    }

	@Override
	protected void _doCmd(PlayerCharacter pcSender, String[] args,
			AbstractGameObject target) {
                    
        if(validateUserInput(pcSender, target, args) == false) {
           this.sendUsage(pcSender);
           return;
            }
                        
        // Valid arguments, attempt to set owner of Building.
        
        _targetBuilding = getTargetAsBuilding(pcSender);

        // if it's a tol change ownership of the city

        if (_targetBuilding.getBlueprint() != null &&
            _targetBuilding.getBlueprint().getBuildingGroup().equals(engine.Enum.BuildingGroup.TOL)) {

            City city = _targetBuilding.getCity();

            if (city != null) {
                city.claim(outOwner);
                return; }
        }
        _targetBuilding.setOwner(outOwner);
                
        DbManager.BuildingQueries.SET_PROPERTY(_targetBuilding, "ownerUUID", args[0]);
        
        _targetBuilding.refreshGuild();
        
	}

	@Override
	protected String _getUsageString() {
        return "' /setowner [UID]";
	}

	@Override
	protected String _getHelpString() {
        return "Assigns new owner to building";
	}
        
        private boolean validateUserInput(PlayerCharacter pcSender, AbstractGameObject currTarget, String[] userInput) {
        
        // Incorrect number of arguments
            
        if (userInput.length != 1)
         return false;    

        // No target
        
         if (currTarget == null) {
           throwbackError(pcSender, "Requires a Building to be targeted");
           return false;
         }
         
        // Target must be an Building
         
         if (currTarget.getObjectType() != GameObjectType.Building) {
             throwbackError(pcSender, "Invalid target. Must be a Building");
            return false; 
         }
         
        // Argument must parse to a long.
         
         try {
         Long.parseLong(userInput[0]); }
        catch (NumberFormatException | NullPointerException e) {
         return false;
        }
         
         // Argument must return a valid NPC or PlayerCharacter
         
         _newOwnerType = DbManager.BuildingQueries.GET_UID_ENUM(Long.parseLong(userInput[0]));

            switch (_newOwnerType) {
                case NPC:
                    outOwner = (AbstractCharacter)DbManager.getObject(GameObjectType.NPC, Integer.parseInt(userInput[0]));
                    break;
                case CHARACTER:
                    outOwner = (AbstractCharacter)DbManager.getObject(GameObjectType.PlayerCharacter, Integer.parseInt(userInput[0]));
                    break;
            }

         if (outOwner == null) {
             throwbackError(pcSender, "Invalid Owner UID");
             return false;
         }
             
        return true;
}

}