/**
 * Copyright (C) 2009 Scalable Solutions.
 */

package se.scalablesolutions.akka.amqp

import se.scalablesolutions.akka.serialization.Serializer
import se.scalablesolutions.akka.actor.Actor

import com.rabbitmq.client.ConnectionParameters

object ExampleSession {
  import AMQP._
  val SERIALIZER = Serializer.Java
  val CONFIG = new ConnectionParameters
  val HOSTNAME = "localhost"
  val PORT = 5672

  val IM = "im.whitehouse.gov"
  val CHAT = "chat.whitehouse.gov"

  def main(args: Array[String]) = {
    println("==== DIRECT ===")
    direct

    Thread.sleep(1000)
    
    println("==== FANOUT ===")
    fanout
  }

  def direct = {
    val consumer = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, IM, ExchangeType.Direct, SERIALIZER, None, 100, false, false, Map[String, AnyRef]())
    consumer ! MessageConsumerListener("@george_bush", "direct", new Actor() {
      def receive: PartialFunction[Any, Unit] = {
        case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
      }
    })
    val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, IM, SERIALIZER, None, None, 100)
    producer ! Message("@jonas_boner: You sucked!!", "direct")
  }

  def fanout = {
    val consumer = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, CHAT, ExchangeType.Fanout, SERIALIZER, None, 100, false, false, Map[String, AnyRef]())
    consumer ! MessageConsumerListener("@george_bush", "", new Actor() {
      def receive: PartialFunction[Any, Unit] = {
        case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
      }
    })
    consumer ! MessageConsumerListener("@barack_obama", "", new Actor() {
      def receive: PartialFunction[Any, Unit] = {
        case Message(payload, _, _, _, _) => log.info("@barack_obama received message from: %s", payload)
      }
    })
    val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, CHAT, SERIALIZER, None, None, 100)
    producer ! Message("@jonas_boner: I'm going surfing", "")
  }
}