/*
 * Copyright (C) 2009-2018 Lightbend Inc. <https://www.lightbend.com>
 */

package akka.persistence.journal.japi;

import java.util.function.Consumer;

import scala.concurrent.Future;

import akka.persistence.PersistentRepr;

interface AsyncRecoveryPlugin {
  //#async-replay-plugin-api
  /**
   * Java API, Plugin API: asynchronously replays persistent messages.
   * Implementations replay a message by calling `replayCallback`. The returned
   * future must be completed when all messages (matching the sequence number
   * bounds) have been replayed. The future must be completed with a failure if
   * any of the persistent messages could not be replayed.
   *
   * The `replayCallback` must also be called with messages that have been
   * marked as deleted. In this case a replayed message's `deleted` method must
   * return `true`.
   *
   * The `toSequenceNr` is the lowest of what was returned by
   * {@link #doAsyncReadHighestSequenceNr} and what the user specified as
   * recovery {@link akka.persistence.Recovery} parameter.
   *
   * @param persistenceId
   *          id of the persistent actor.
   * @param fromSequenceNr
   *          sequence number where replay should start (inclusive).
   * @param toSequenceNr
   *          sequence number where replay should end (inclusive).
   * @param max
   *          maximum number of messages to be replayed.
   * @param replayCallback
   *          called to replay a single message. Can be called from any thread.
   */
  Future<Void> doAsyncReplayMessages(String persistenceId, long fromSequenceNr,
      long toSequenceNr, long max, Consumer<PersistentRepr> replayCallback);

  /**
   * Java API, Plugin API: asynchronously reads the highest stored sequence
   * number for the given `persistenceId`. The persistent actor will use the
   * highest sequence number after recovery as the starting point when
   * persisting new events. This sequence number is also used as `toSequenceNr`
   * in subsequent call to [[#asyncReplayMessages]] unless the user has
   * specified a lower `toSequenceNr`.
   *
   * @param persistenceId
   *          id of the persistent actor.
   * @param fromSequenceNr
   *          hint where to start searching for the highest sequence number.
   */
  Future<Long> doAsyncReadHighestSequenceNr(String persistenceId, long fromSequenceNr);
  //#async-replay-plugin-api
}
