/** Handle the command */
  @Override
  public void handle(final CallInfo call) {

    // Allow for canceling tasks
    if (call.getArgs().length > 1 && call.getArg(1).equals("cancel")) {
      if (plugin.getPurgeManager().deleteTask != null) {
        plugin.getPurgeManager().deleteTask.cancel();
        call.getSender()
            .sendMessage(Prism.messenger.playerMsg("Current purge tasks have been canceled."));
      } else {
        call.getSender()
            .sendMessage(Prism.messenger.playerError("No purge task is currently running."));
      }
      return;
    }

    // Allow for wiping live queue
    if (call.getArgs().length > 1 && call.getArg(1).equals("queue")) {
      if (RecordingQueue.getQueue().size() > 0) {
        Prism.log(
            "User "
                + call.getSender().getName()
                + " wiped the live queue before it could be written to the database. "
                + RecordingQueue.getQueue().size()
                + " events lost.");
        RecordingQueue.getQueue().clear();
        call.getSender()
            .sendMessage(Prism.messenger.playerSuccess("Unwritten data in queue cleared."));
      } else {
        call.getSender()
            .sendMessage(Prism.messenger.playerError("Event queue is empty, nothing to wipe."));
      }
      return;
    }

    // Process and validate all of the arguments
    final QueryParameters parameters =
        PreprocessArgs.process(
            plugin,
            call.getSender(),
            call.getArgs(),
            PrismProcessType.DELETE,
            1,
            !plugin.getConfig().getBoolean("prism.queries.never-use-defaults"));
    if (parameters == null) {
      return;
    }
    parameters.setStringFromRawArgs(call.getArgs(), 1);

    // determine if defaults were used
    final ArrayList<String> defaultsUsed = parameters.getDefaultsUsed();
    String defaultsReminder = "";
    if (!defaultsUsed.isEmpty()) {
      defaultsReminder += " using defaults:";
      for (final String d : defaultsUsed) {
        defaultsReminder += " " + d;
      }
    }

    if (parameters.getFoundArgs().size() > 0) {

      // Identify the minimum for chunking
      final int minId = PurgeChunkingUtil.getMinimumPrimaryKey();
      if (minId == 0) {
        call.getSender()
            .sendMessage(
                Prism.messenger.playerError(
                    "No minimum primary key could be found for purge chunking"));
        return;
      }

      // Identify the max id for chunking
      final int maxId = PurgeChunkingUtil.getMaximumPrimaryKey();
      if (maxId == 0) {
        call.getSender()
            .sendMessage(
                Prism.messenger.playerError(
                    "No maximum primary key could be found for purge chunking"));
        return;
      }

      call.getSender()
          .sendMessage(
              Prism.messenger.playerSubduedHeaderMsg("Purging data..." + defaultsReminder));

      int purge_tick_delay = plugin.getConfig().getInt("prism.purge.batch-tick-delay");
      if (purge_tick_delay < 1) {
        purge_tick_delay = 20;
      }

      call.getSender()
          .sendMessage(
              Prism.messenger.playerHeaderMsg(
                  "Starting purge cycle." + ChatColor.GRAY + " No one will ever know..."));

      // build callback
      final SenderPurgeCallback callback = new SenderPurgeCallback();
      callback.setSender(call.getSender());

      // add to an arraylist so we're consistent
      final CopyOnWriteArrayList<QueryParameters> paramList =
          new CopyOnWriteArrayList<QueryParameters>();
      paramList.add(parameters);

      Prism.log(
          "Beginning prism database purge cycle. Will be performed in batches so we don't tie up the db...");
      deleteTask =
          plugin
              .getServer()
              .getScheduler()
              .runTaskAsynchronously(
                  plugin,
                  new PurgeTask(plugin, paramList, purge_tick_delay, minId, maxId, callback));

    } else {
      call.getSender()
          .sendMessage(Prism.messenger.playerError("You must supply at least one parameter."));
    }
  }