import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.command.builder.arguments.number.ArgumentNumber;
import net.minestom.server.entity.Player;

public class CustomCommand extends Command {
    
    public CustomCommand() {
        super("mycommand");
        
        // String argument
        var nameArg = ArgumentType.String("name");
        
        // Integer argument with range
        var countArg = ArgumentType.Integer("count")
            .min(1)
            .max(100);
        
        // Double argument
        var amountArg = ArgumentType.Double("amount");
        
        // Word argument (single word)
        var actionArg = ArgumentType.Word("action")
            .from("start", "stop", "restart");
        
        // Player argument (optional)
        var targetArg = ArgumentType.Entity("target")
            .onlyPlayers(true);
        
        // First syntax: command <name> <count>
        addSyntax((sender, context) -> {
            String name = context.get(nameArg);
            int count = context.get(countArg);
            
            sender.sendMessage("Executing " + name + " " + count + " times");
            
            if (sender instanceof Player player) {
                // Player-specific logic
                player.sendMessage("Command executed as player");
            }
        }, nameArg, countArg);
        
        // Second syntax: command <action> [target]
        addSyntax((sender, context) -> {
            String action = context.get(actionArg);
            
            if (context.has(targetArg)) {
                var target = context.get(targetArg);
                sender.sendMessage("Action " + action + " on " + target);
            } else {
                sender.sendMessage("Action " + action);
            }
        }, actionArg, targetArg.setDefaultValue(() -> null));
        
        // Set conditions
        setCondition((sender, commandString) -> {
            if (!(sender instanceof Player)) {
                sender.sendMessage("This command can only be used by players");
                return false;
            }
            return true;
        });
    }
}

// Register command
MinecraftServer.getCommandManager().register(new CustomCommand());