/*
   * (non-Javadoc)
   * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#onTabComplete(org.bukkit.entity.Player, java.lang.String[])
   */
  @Override
  public List<String> onTabComplete(Player sender, String[] args) {
    ArrayList<String> list = new ArrayList<>();
    if (args.length == 1) {
      list.add(Language.COMMAND_SETVALUE.toString());
    }
    if (args.length == 2) {
      list.addAll(Sets.newHashSet(SpleefArena.getArenaNames()));
    }
    if (args.length == 3) {
      list.add(Language.FLAG_ENABLED.toString());
      list.add(Language.FLAG_SNOWBALLS_ENABLED.toString());
      list.add(Language.FLAG_MAX_SNOWBALLS.toString());
      list.add(Language.FLAG_MODE.toString());
      list.add(Language.FLAG_CUSTOMINVENTORY.toString());
      list.add(Language.FLAG_CUSTOMINVENTORY_ENABLED.toString());
      list.add(Language.FLAG_VEHICLE.toString());
      list.add(Language.FLAG_INSTANT_BLOCK_DESTORY.toString());
      list.add(Language.FLAG_REWARD_MONEY_PARTICIPATION.toString());
      list.add(Language.FLAG_REWARD_MONEY_WINNING.toString());
      list.add(Language.FLAG_REWARD_POINTS_PARTICIPATION.toString());
      list.add(Language.FLAG_REWARD_POINTS_WINNING.toString());
      list.add(Language.FLAG_FREEZE_PLAYERS.toString());
      list.add(Language.FLAG_MODIFY_GRAVITY.toString());
      list.add(Language.FLAG_GRAVITY.toString());
      list.add(Language.FLAG_MIN_PLAYERS.toString());
      list.add(Language.FLAG_REQUIRED_PLAYERS_TO_START_COUNTDOWN.toString());
      list.add(Language.FLAG_SPECTATE_TYPE.toString());
      list.add(Language.FLAG_SPECTATE_LOCATION.toString());
      list.add(Language.FLAG_ARENA_COUNTDOWN.toString());
      list.add(Language.FLAG_LOBBY_COUNTDOWN.toString());
    }
    if (args.length == 4) {
      if (args[2].equalsIgnoreCase(Language.FLAG_ENABLED.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_SNOWBALLS_ENABLED.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_CUSTOMINVENTORY_ENABLED.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_INSTANT_BLOCK_DESTORY.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_FREEZE_PLAYERS.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_MODIFY_GRAVITY.toString())) {
        list.add(Language.VALUE_TRUE.toString());
        list.add(Language.VALUE_FALSE.toString());
      }
      if (args[2].equalsIgnoreCase(Language.FLAG_MAX_SNOWBALLS.toString())) {
        list.add("0");
        list.add("1");
        list.add("5");
        list.add("16");
        list.add("32");
        list.add("64");
      }
      if (args[2].equalsIgnoreCase(Language.FLAG_MODE.toString())) {
        list.add(Language.VALUE_MODE_NORMAL.toString());
        list.add(Language.VALUE_MODE_BOWSPLEEF.toString());
        list.add(Language.VALUE_MODE_SPLEGG.toString());
        list.add(Language.VALUE_MODE_SPLEEF_RUN.toString());
        // list.add(Language.VALUE_MODE_SUPER_SPLEEF.toString()); // TODO enable super gamemodes
        // list.add(Language.VALUE_MODE_SUPER_SPLEGG.toString()); // TODO enable super gamemodes
      }
      if (args[2].equalsIgnoreCase(Language.FLAG_VEHICLE.toString())) {
        try {
          list.add(EntityType.RABBIT.name().toLowerCase());
        } catch (Exception e) {
          // older versions of minecraft don't have rabbits :(
          // A life without rabbits is not livable!
        }
        list.add(EntityType.VILLAGER.name().toLowerCase());
        list.add(EntityType.PIG.name().toLowerCase());
        list.add(EntityType.OCELOT.name().toLowerCase());
        list.add(EntityType.SHEEP.name().toLowerCase());
        list.add("none");
      }
      if (args[2].equalsIgnoreCase(Language.FLAG_REWARD_MONEY_PARTICIPATION.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_REWARD_MONEY_WINNING.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_REWARD_POINTS_PARTICIPATION.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_REWARD_POINTS_WINNING.toString())) {
        list.add("0");
        list.add("10");
        list.add("25");
        list.add("50");
        list.add("100");
        list.add("150");
        list.add("200");
        list.add("500");
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_ARENA_COUNTDOWN.toString())
          || args[2].equalsIgnoreCase(Language.FLAG_LOBBY_COUNTDOWN.toString())) {
        list.add("10");
        list.add("15");
        list.add("20");
        list.add("30");
        list.add("45");
        list.add("60");
        list.add("100");
        list.add("120");
        list.add("250");
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_GRAVITY.toString())) {
        list.add("0.25");
        list.add("0.5");
        list.add("0.75");
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_MIN_PLAYERS.toString())
          || args[2].equalsIgnoreCase(
              Language.FLAG_REQUIRED_PLAYERS_TO_START_COUNTDOWN.toString())) {
        list.add("2");
        list.add("4");
        list.add("8");
        list.add("12");
        list.add("16");
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_SPECTATE_TYPE.toString())) {
        list.add(Language.SPECTATE_TYPE_NONE.toString());
        list.add(Language.SPECTATE_TYPE_NORMAL.toString());
        list.add(Language.SPECTATE_TYPE_NORMAL_FLYING.toString());
        list.add(Language.SPECTATE_TYPE_GAMEMODE_3.toString());
      }
    }
    return list;
  }
  /*
   * (non-Javadoc)
   * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#executeForPlayer(org.bukkit.entity.Player, org.bukkit.command.Command, java.lang.String[])
   */
  @Override
  public CommandResult executeForPlayer(Player player, Command cmd, String[] args) {
    if (args.length == 4) {

      if (!player.hasPermission(getPermission())) {
        return CommandResult.NO_PERMISSION;
      }

      SpleefArena arena = null;
      for (SpleefArena sArena : SpleefArena.getSpleefArenas()) {
        if (sArena.getName().equals(args[1])) {
          arena = sArena;
          break;
        }
      }

      if (arena == null) {
        player.sendMessage(Language.NO_ARENA_WITH_NAME.toString().replace("%arena%", args[1]));
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_ENABLED.toString())) {
        boolean enabled = args[3].equalsIgnoreCase(Language.VALUE_TRUE.toString());
        String strValue =
            enabled ? Language.VALUE_TRUE.toString() : Language.VALUE_FALSE.toString();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_ENABLED.toString())
                .replace("%value%", strValue));

        arena.getConfiguration().setDisabled(!enabled);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("enabled", enabled);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_SNOWBALLS_ENABLED.toString())) {
        boolean enabled = args[3].equalsIgnoreCase(Language.VALUE_TRUE.toString());
        String strValue =
            enabled ? Language.VALUE_TRUE.toString() : Language.VALUE_FALSE.toString();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_ENABLED.toString())
                .replace("%value%", strValue));

        arena.getConfiguration().setEnableSnowballs(enabled);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("snowballs.enabled", enabled);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_MAX_SNOWBALLS.toString())) {
        int maxSnowballs;
        try {
          maxSnowballs = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_ENABLED.toString())
                .replace("%value%", String.valueOf(maxSnowballs)));

        arena.getConfiguration().setMaxSnowballs(maxSnowballs);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("snowballs.maxSnowballs", maxSnowballs);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_MODE.toString())) {
        if (args[3].equalsIgnoreCase(Language.VALUE_MODE_NORMAL.toString())) {
          arena.getConfiguration().setMode(SpleefMode.NORMAL);
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_MODE.toString())
                  .replace("%value%", Language.VALUE_MODE_NORMAL.toString()));
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("mode", arena.getConfiguration().getMode().name().toLowerCase());
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          return CommandResult.SUCCESS;
        }
        if (args[3].equalsIgnoreCase(Language.VALUE_MODE_BOWSPLEEF.toString())) {
          arena.getConfiguration().setMode(SpleefMode.BOWSPLEEF);
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_MODE.toString())
                  .replace("%value%", Language.VALUE_MODE_BOWSPLEEF.toString()));
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("mode", arena.getConfiguration().getMode().name().toLowerCase());
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          return CommandResult.SUCCESS;
        }
        if (args[3].equalsIgnoreCase(Language.VALUE_MODE_SPLEGG.toString())) {
          arena.getConfiguration().setMode(SpleefMode.SPLEGG);
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_MODE.toString())
                  .replace("%value%", Language.VALUE_MODE_SPLEGG.toString()));
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("mode", arena.getConfiguration().getMode().name().toLowerCase());
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          return CommandResult.SUCCESS;
        }
        if (args[3].equalsIgnoreCase(Language.VALUE_MODE_SPLEEF_RUN.toString())) {
          arena.getConfiguration().setMode(SpleefMode.SPLEEF_RUN);
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_MODE.toString())
                  .replace("%value%", Language.VALUE_MODE_SPLEEF_RUN.toString()));
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("mode", arena.getConfiguration().getMode().name().toLowerCase());
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          return CommandResult.SUCCESS;
        }
        if (args[3].equalsIgnoreCase(Language.VALUE_MODE_SUPER_SPLEEF.toString())) {
          arena.getConfiguration().setMode(SpleefMode.SUPER_SPLEEF);
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_MODE.toString())
                  .replace("%value%", Language.VALUE_MODE_SUPER_SPLEEF.toString()));
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("mode", arena.getConfiguration().getMode().name().toLowerCase());
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          return CommandResult.SUCCESS;
        }
        if (args[3].equalsIgnoreCase(Language.VALUE_MODE_SUPER_SPLEGG.toString())) {
          arena.getConfiguration().setMode(SpleefMode.SUPER_SPLEGG);
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_MODE.toString())
                  .replace("%value%", Language.VALUE_MODE_SUPER_SPLEGG.toString()));
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("mode", arena.getConfiguration().getMode().name().toLowerCase());
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          return CommandResult.SUCCESS;
        }
        player.sendMessage(Language.UNKNOWN_MODE.toString());
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_CUSTOMINVENTORY_ENABLED.toString())) {
        boolean enabled = args[3].equalsIgnoreCase(Language.VALUE_TRUE.toString());
        String strValue =
            enabled ? Language.VALUE_TRUE.toString() : Language.VALUE_FALSE.toString();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_CUSTOMINVENTORY_ENABLED.toString())
                .replace("%value%", strValue));

        arena.getConfiguration().setCustomInventory(enabled);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("customInventory.enabled", enabled);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_VEHICLE.toString())) {
        if (args[3].equalsIgnoreCase("none")) {
          arena.getConfiguration().setVehicle(null);
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("vehicle", "none");
          SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
          player.sendMessage(
              Language.SUCCESSFULLY_SET_VALUE
                  .toString()
                  .replace("%flag%", Language.FLAG_VEHICLE.toString())
                  .replace("%value%", "none"));
          return CommandResult.SUCCESS;
        }
        EntityType type;
        try {
          type = EntityType.valueOf(args[3].toUpperCase());
        } catch (IllegalArgumentException e) {
          player.sendMessage(Language.UNKNOWN_ENTITY.toString());
          return CommandResult.SUCCESS;
        }
        if (!type.isSpawnable()) {
          player.sendMessage(Language.UNKNOWN_ENTITY.toString());
          return CommandResult.SUCCESS;
        }
        /* TODO
        if (!type.getEntityClass().isAssignableFrom(LivingEntity.class)) {
        	player.sendMessage(Language.UNKNOWN_ENTITY.toString());
        	return CommandResult.SUCCESS;
        }
        */
        arena.getConfiguration().setVehicle(type);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("vehicle", type.name().toLowerCase());
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_VEHICLE.toString())
                .replace("%value%", type.name().toLowerCase()));
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_INSTANT_BLOCK_DESTORY.toString())) {
        boolean enabled = args[3].equalsIgnoreCase(Language.VALUE_TRUE.toString());
        String strValue =
            enabled ? Language.VALUE_TRUE.toString() : Language.VALUE_FALSE.toString();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_INSTANT_BLOCK_DESTORY.toString())
                .replace("%value%", strValue));

        arena.getConfiguration().setInstanstBlockDestroy(enabled);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("instantBlockDestroy", enabled);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_REWARD_MONEY_PARTICIPATION.toString())) {
        int reward;
        try {
          reward = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_REWARD_MONEY_PARTICIPATION.toString())
                .replace("%value%", String.valueOf(reward)));

        arena.getConfiguration().setMoneyParticipationReward(reward);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("reward.money.participation", reward);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_REWARD_MONEY_WINNING.toString())) {
        int reward;
        try {
          reward = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_REWARD_MONEY_WINNING.toString())
                .replace("%value%", String.valueOf(reward)));

        arena.getConfiguration().setMoneyWinningReward(reward);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("reward.money.winning", reward);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_REWARD_POINTS_PARTICIPATION.toString())) {
        int reward;
        try {
          reward = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_REWARD_POINTS_PARTICIPATION.toString())
                .replace("%value%", String.valueOf(reward)));

        arena.getConfiguration().setPointsParticipationReward(reward);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("reward.points.participation", reward);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_REWARD_POINTS_WINNING.toString())) {
        int reward;
        try {
          reward = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_REWARD_POINTS_WINNING.toString())
                .replace("%value%", String.valueOf(reward)));

        arena.getConfiguration().setPointsWinningReward(reward);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("reward.points.winning", reward);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_FREEZE_PLAYERS.toString())) {
        boolean enabled = args[3].equalsIgnoreCase(Language.VALUE_TRUE.toString());
        String strValue =
            enabled ? Language.VALUE_TRUE.toString() : Language.VALUE_FALSE.toString();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_FREEZE_PLAYERS.toString())
                .replace("%value%", strValue));

        arena.getConfiguration().setFreezePlayers(enabled);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("freezePlayers", enabled);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_MODIFY_GRAVITY.toString())) {
        boolean enabled = args[3].equalsIgnoreCase(Language.VALUE_TRUE.toString());
        String strValue =
            enabled ? Language.VALUE_TRUE.toString() : Language.VALUE_FALSE.toString();
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_MODIFY_GRAVITY.toString())
                .replace("%value%", strValue));

        arena.getConfiguration().setModifyGravity(enabled);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("modifygravity.enable", enabled);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_GRAVITY.toString())) {
        double gravity;
        try {
          gravity = Double.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER_BETWEEN_0_AND_1.toString());
          return CommandResult.SUCCESS;
        }
        if (gravity <= 0 || gravity >= 1) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER_BETWEEN_0_AND_1.toString());
          return CommandResult.SUCCESS;
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_GRAVITY.toString())
                .replace("%value%", String.valueOf(gravity)));

        arena.getConfiguration().setGravity(gravity);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("modifygravity.gravity", gravity);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_MIN_PLAYERS.toString())) {
        int minPlayers;
        try {
          minPlayers = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }

        minPlayers = minPlayers < 2 ? 2 : minPlayers; // must be at least 2
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_MIN_PLAYERS.toString())
                .replace("%value%", String.valueOf(minPlayers)));

        arena.getConfiguration().setMinPlayers(minPlayers);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("minPlayers", minPlayers);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_REQUIRED_PLAYERS_TO_START_COUNTDOWN.toString())) {
        int requiredPlayersToStartCountdown;
        try {
          requiredPlayersToStartCountdown = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }

        requiredPlayersToStartCountdown =
            requiredPlayersToStartCountdown < 2
                ? 2
                : requiredPlayersToStartCountdown; // must be at least 2
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_REQUIRED_PLAYERS_TO_START_COUNTDOWN.toString())
                .replace("%value%", String.valueOf(requiredPlayersToStartCountdown)));

        arena.getConfiguration().setMinPlayers(requiredPlayersToStartCountdown);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("requiredPlayersToStartCountdown", requiredPlayersToStartCountdown);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_SPECTATE_TYPE.toString())) {

        SpectateType spectateType = SpectateType.NONE;
        String spectateTypeName = Language.SPECTATE_TYPE_NONE.toString();
        if (args[3].equalsIgnoreCase(Language.SPECTATE_TYPE_NORMAL.toString())) {
          spectateType = SpectateType.NORMAL;
          spectateTypeName = Language.SPECTATE_TYPE_NORMAL.toString();
        }
        if (args[3].equalsIgnoreCase(Language.SPECTATE_TYPE_NORMAL_FLYING.toString())) {
          spectateType = SpectateType.NORMAL_FLYING;
          spectateTypeName = Language.SPECTATE_TYPE_NORMAL_FLYING.toString();
        }
        if (args[3].equalsIgnoreCase(Language.SPECTATE_TYPE_GAMEMODE_3.toString())) {
          spectateType = SpectateType.GAMEMODE_3;
          spectateTypeName = Language.SPECTATE_TYPE_GAMEMODE_3.toString();
        }
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_SPECTATE_TYPE.toString())
                .replace("%value%", spectateTypeName));

        arena.getConfiguration().setSpectateType(spectateType);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("spectateType", spectateType.name().toLowerCase());
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_ARENA_COUNTDOWN.toString())) {
        int arenaCountdown;
        try {
          arenaCountdown = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }

        arenaCountdown = arenaCountdown < 0 ? 0 : arenaCountdown; // must be at least 0
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_ARENA_COUNTDOWN.toString())
                .replace("%value%", String.valueOf(arenaCountdown)));

        arena.getConfiguration().setArenaCountdown(arenaCountdown);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("arenaCountdown", arenaCountdown);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_LOBBY_COUNTDOWN.toString())) {
        int lobbyCountdown;
        try {
          lobbyCountdown = Integer.valueOf(args[3]);
        } catch (NumberFormatException e) {
          player.sendMessage(Language.VALUE_MUST_BE_A_NUMBER.toString());
          return CommandResult.SUCCESS;
        }

        lobbyCountdown = lobbyCountdown < 5 ? 5 : lobbyCountdown; // must be at least 5
        player.sendMessage(
            Language.SUCCESSFULLY_SET_VALUE
                .toString()
                .replace("%flag%", Language.FLAG_LOBBY_COUNTDOWN.toString())
                .replace("%value%", String.valueOf(lobbyCountdown)));

        arena.getConfiguration().setLobbyCountdown(lobbyCountdown);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("lobbyCountdown", lobbyCountdown);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        return CommandResult.SUCCESS;
      }

      player.sendMessage(Language.UNKNOWN_FLAG.toString().replace("%flag%", args[2]));
      return CommandResult.SUCCESS;
    }

    // flags without arguments
    if (args.length == 3) {
      if (!player.hasPermission(getPermission())) {
        return CommandResult.NO_PERMISSION;
      }

      SpleefArena arena = null;
      for (SpleefArena sArena : SpleefArena.getSpleefArenas()) {
        if (sArena.getName().equals(args[1])) {
          arena = sArena;
          break;
        }
      }

      if (arena == null) {
        player.sendMessage(Language.NO_ARENA_WITH_NAME.toString().replace("%arena%", args[1]));
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_CUSTOMINVENTORY.toString())) {
        ItemStack[] contents = player.getInventory().getContents();
        for (int i = 0; i < contents.length; i++) {
          SpleefMain.getInstance()
              .getArenaAccessor(arena.getName())
              .getConfig()
              .set("customInventory.items." + i, contents[i]);
        }

        arena.getConfiguration().setCustomInventoryContents(contents);
        arena.getConfiguration().setCustomInventory(true);
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("customInventory.enabled", true);
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        player.sendMessage(Language.SUCCESSFULLY_SET_CUSTOMINVENTORY.toString());
        return CommandResult.SUCCESS;
      }

      if (args[2].equalsIgnoreCase(Language.FLAG_SPECTATE_LOCATION.toString())) {
        arena.getConfiguration().setSpectateLocation(player.getLocation());

        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("spectateLocation.x", player.getLocation().getX());
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("spectateLocation.y", player.getLocation().getY());
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("spectateLocation.z", player.getLocation().getZ());
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("spectateLocation.yaw", player.getLocation().getYaw());
        SpleefMain.getInstance()
            .getArenaAccessor(arena.getName())
            .getConfig()
            .set("spectateLocation.pitch", player.getLocation().getPitch());
        SpleefMain.getInstance().getArenaAccessor(arena.getName()).saveConfig();
        player.sendMessage(Language.SUCCESSFULLY_SET_SPECTATE_LOCATION.toString());
        return CommandResult.SUCCESS;
      }
    }
    return CommandResult.ERROR;
  }