// Simple command with one syntax
public class SimpleCommand extends Command {
    public SimpleCommand() {
        super("hello");
        
        // Single string argument
        var nameArg = ArgumentType.String("name");
        
        // Syntax: /hello <name>
        addSyntax((sender, context) -> {
            String name = context.get(nameArg);
            sender.sendMessage("Hello, " + name + "!");
        }, nameArg);
    }
}

// Command with multiple syntaxes
public class MultiSyntaxCommand extends Command {
    public MultiSyntaxCommand() {
        super("teleport");
        
        var xArg = ArgumentType.Double("x");
        var yArg = ArgumentType.Double("y");
        var zArg = ArgumentType.Double("z");
        var playerArg = ArgumentType.Player("target");
        
        // Syntax 1: /teleport <x> <y> <z>
        addSyntax((sender, context) -> {
            if (sender instanceof Player player) {
                double x = context.get(xArg);
                double y = context.get(yArg);
                double z = context.get(zArg);
                player.teleport(new Pos(x, y, z));
            }
        }, xArg, yArg, zArg);
        
        // Syntax 2: /teleport <target>
        addSyntax((sender, context) -> {
            if (sender instanceof Player player) {
                Player target = context.get(playerArg);
                player.teleport(target.getPosition());
            }
        }, playerArg);
    }
}

// Command with conditions
public class PlayerOnlyCommand extends Command {
    public PlayerOnlyCommand() {
        super("fly");
        
        // Only allow players to use this command
        setCondition((sender, commandString) -> {
            if (!(sender instanceof Player)) {
                sender.sendMessage("This command can only be used by players!");
                return false;
            }
            return true;
        });
        
        addSyntax((sender, context) -> {
            // Command logic for players only
        });
    }
}