/*
 *  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.toree.kernel.protocol

import org.apache.toree.kernel.protocol.v5.MIMEType.MIMEType
import play.api.libs.json.{JsValue, Json}

package object v5 {
  // Provide a UUID type representing a string (there is no object)
  type UUID = String

  // Provide a ParentHeader type and object representing a Header
  type ParentHeader = Header
  val ParentHeader = Header

  // Provide a Metadata type and object representing a map
  type Metadata = Map[String, JsValue]
  object Metadata {
    def apply(kv:(String, String)*):Metadata = {
      if(kv.isEmpty) {
        Map.empty
      } else {
        kv.toMap.mapValues(v => Json.parse(v))
      }
    }

    val empty = Map.empty
  }

  // Provide a Data type and object representing a map
  type Data = Map[MIMEType, String]
  val Data = Map

  // Provide a UserExpressions type and object representing a map
  type UserExpressions = Map[String, String]
  val UserExpressions = Map

  // Provide a Payloads type and object representing a list of maps
  type Payloads = List[Map[String, String]]
  val Payloads = List

  // Provide a MsgData type representing an arbitrary JSON value
  type MsgData = JsValue
  val MsgData = new {
    def apply(xs: (String, Json.JsValueWrapper)*) = Json.obj(xs: _*)

    val Empty = Json.obj()
  }

  // TODO: Split this into client/server socket types and move them to their
  //       respective projects
  object SocketType extends Enumeration {
    type SocketType = Value

    // Server-specific actors
    val Shell       = Value("shell")
    val IOPub       = Value("io_pub")
    val StdIn       = Value("std_in")
    val Control     = Value("control")
    val Heartbeat   = Value("heartbeat")

    // Client-specific actors
    val ShellClient       = Value("shell_client")
    val IOPubClient       = Value("io_pub_client")
    val StdInClient       = Value("std_in_client")
    val ControlClient     = Value("control_client")
    val HeartbeatClient   = Value("heartbeat_client")
  }

  object MessageType extends Enumeration {
    type MessageType    = Value

    /**
     * Represents all incoming messages.
     */
    val Incoming = new {
      val CompleteRequest = Value("complete_request")
      val ConnectRequest  = Value("connect_request")
      val ExecuteRequest  = Value("execute_request")
      val HistoryRequest  = Value("history_request")
      val InspectRequest  = Value("inspect_request")
      val KernelInfoRequest  = Value("kernel_info_request")
      val ShutdownRequest = Value("shutdown_request")
      val CommInfoRequest = Value("comm_info_request")
      val IsCompleteRequest = Value("is_complete_request")

      //  Stdin Router/Dealer Messages
      val InputReply      = Value("input_reply")

      // NOTE: These are not consistent with the type as they would conflict
      val CommOpen        = Value("incoming_comm_open")
      val CommMsg         = Value("incoming_comm_msg")
      val CommClose       = Value("incoming_comm_close")
    }

    /**
     * Represents all outgoing messages.
     */
    val Outgoing = new {
      //  Shell Router/Dealer Messages
      val CompleteReply   = Value("complete_reply")
      val ConnectReply    = Value("connect_reply")
      val ExecuteReply    = Value("execute_reply")
      val HistoryReply    = Value("history_reply")
      val InspectReply    = Value("inspect_reply")
      val KernelInfoReply    = Value("kernel_info_reply")
      val ShutdownReply   = Value("shutdown_reply")
      val CommInfoReply   = Value("comm_info_reply")
      val IsCompleteReply = Value("is_complete_reply")

      //  Stdin Router/Dealer Messages
      val InputRequest    = Value("input_request")

      //  Pub/Sub Messages
      val ClearOutput     = Value("clear_output")
      val DisplayData     = Value("display_data")
      val Error           = Value("error")
      val ExecuteInput    = Value("execute_input")
      val ExecuteResult   = Value("execute_result")
      val Status          = Value("status")
      val Stream          = Value("stream")

      // NOTE: These are not consistent with the type as they would conflict
      val CommOpen        = Value("outgoing_comm_open")
      val CommMsg         = Value("outgoing_comm_msg")
      val CommClose       = Value("outgoing_comm_close")
    }
  }

  object HandlerType extends Enumeration {
    type HandlerType = Value

    val ExecuteRequestHandler = Value("execute_request_handler")
  }

  object SystemActorType extends Enumeration {
    type SystemActorType = Value

    val KernelMessageRelay  = Value("kernel_message_relay")
    val ExecuteRequestRelay = Value("execute_request_relay")
    val Interpreter         = Value("interpreter")
    val MagicManager        = Value("magic_manager")
    val StatusDispatch      = Value("status_dispatch")
  }

  object KernelStatusType extends Enumeration {
    type KernelStatusType = Value

    val Starting  = Value("starting")
    val Busy      = Value("busy")
    val Idle      = Value("idle")
  }

  object MIMEType extends Enumeration {
    type MIMEType = String

    val PlainText               = """text/plain"""
    val ImagePng                = """image/png"""
    val TextHtml                = """text/html"""
    val ApplicationJson         = """application/json"""
    val ApplicationJavaScript   = """application/javascript"""
  }
}