package test

import akka.actor._
import scala.concurrent.duration._

case class Message(data:Int)

class A extends ReliableMessaging {
  override def persistenceId = "A-id"
  override def processCommand: Receive = {
    case Message(data) => {
      deliver(Message(data), ActorPath.fromString(context.system + "/user/B"))
    }
  }
}

class B extends ReliableMessaging {
  override def persistenceId = "B-id"
  override def processCommand: Receive = {
    case Message(data) => {
      deliver(Message(data), ActorPath.fromString(context.system + "/user/C"))
    }
  }
}

class C extends ReliableMessaging {
  var maxReceived = 0
  override def persistenceId = "C-id"
  override def processCommand: Receive = {
    case Message(data) =>{
      if (!recoveryFinished)
        println(s"$self recovery not finished")
      if(maxReceived>data)
        println(s"Redelivery $data")
      else if(data % 1000 == 0)
        println(data)
      maxReceived = Math.max(maxReceived, data)
    }
  }
}

object Application extends App {
  val system = ActorSystem("TestSystem")

  val a = system.actorOf(Props[A], "A")
  val b = system.actorOf(Props[B], "B")
  val c = system.actorOf(Props[C], "C")

  if(!args.contains("restart"))
  {
    for (x <- 1 to 100000) a ! Message(x)
  }
}
