/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.gearpump.streaming

import akka.actor.ActorRef

import org.apache.gearpump.Time.MilliSeconds
import org.apache.gearpump.cluster.appmaster.WorkerInfo
import org.apache.gearpump.cluster.scheduler.Resource
import org.apache.gearpump.streaming.appmaster.TaskRegistry.TaskLocations
import org.apache.gearpump.streaming.task.{Subscriber, TaskId}
import org.apache.gearpump.transport.HostPort

object AppMasterToExecutor {
  case class LaunchTasks(
      taskId: List[TaskId], dagVersion: Int, processorDescription: ProcessorDescription,
      subscribers: List[Subscriber])

  case object TasksLaunched

  /**
   * dagVersion, life, and subscribers will be changed on target task list.
   */
  case class ChangeTasks(
      taskId: List[TaskId], dagVersion: Int, life: LifeTime, subscribers: List[Subscriber])

  case class TasksChanged(taskIds: List[TaskId])

  case class ChangeTask(
      taskId: TaskId, dagVersion: Int, life: LifeTime, subscribers: List[Subscriber])

  case class TaskChanged(taskId: TaskId, dagVersion: Int)

  case class StartTask(taskId: TaskId)

  case class StopTask(taskId: TaskId)

  case class TaskLocationsReady(taskLocations: TaskLocations, dagVersion: Int)

  case class TaskLocationsReceived(dagVersion: Int, executorId: ExecutorId)

  case class TaskLocationsRejected(
      dagVersion: Int, executorId: ExecutorId, reason: String, ex: Throwable)

  case class StartAllTasks(dagVersion: Int)

  case class StartDynamicDag(dagVersion: Int)
  case class TaskRegistered(taskId: TaskId, sessionId: Int, startClock: MilliSeconds)
  case class TaskRejected(taskId: TaskId)

  case object RestartClockService
  class MsgLostException extends Exception
}

object ExecutorToAppMaster {
  case class RegisterExecutor(
      executor: ActorRef, executorId: Int, resource: Resource, worker : WorkerInfo)

  case class RegisterTask(taskId: TaskId, executorId: Int, task: HostPort)
  case class UnRegisterTask(taskId: TaskId, executorId: Int)

  case class MessageLoss(executorId: Int, taskId: TaskId,
      cause: String, ex: Option[Throwable] = None)
}

object AppMasterToMaster {
  case class StallingTasks(tasks: List[TaskId])
}
