/**
  * (C) Copyright Litbit 2016
  *
  * Licensed 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.
  *
  */

import sbt._
import sbt.Keys._
import sbtassembly.AssemblyPlugin.autoImport._

object ModuleDependencies {

  import Dependencies._
  val FeyDependencies           = compile(akka_actor,typesafe_config,playJson,slf4j,log4jbind,sprayCan,
                                            sprayRouting,jsonValidator,javaFilter,codec,apacheIO,playNetty) ++ test(akka_testkit, scala_test)
  val StreamDependencies        = provided(akka_actor, fey)
  val ZMQDependencies           = provided(akka_actor,  fey) ++ compile(zmq)
  val VirtualSensorDependencies = provided(akka_actor,  fey) ++ compile(math3)
}

object IotaBuild extends Build {

  import BuildSettings._

  lazy val parent = Project(
    id = "iota",
    base = file("."),
    aggregate = Seq(stream, zmq, virtual_sensor, fey),
    settings = rootbuildSettings ++ Seq(
      aggregate in update := false
    )
  )

  lazy val fey = Project(
    id = "fey-core",
    base = file("./fey-core"),
    settings = BasicSettings ++ FeybuildSettings ++ Seq(
      libraryDependencies ++= ModuleDependencies.FeyDependencies

    ))

  lazy val stream = Project(
    id = "fey-stream",
    base = file("./performers/stream"),
    settings = BasicSettings ++ StreambuildSettings ++ Seq(
      libraryDependencies ++= ModuleDependencies.StreamDependencies,
      assemblyJarName in assembly := "fey_stream.jar"
    )
  )

   lazy val zmq = Project(
    id = "fey-zmq",
    base = file("./performers/zmq"),
    settings = BasicSettings ++ ZMQbuildSettings ++ Seq(
      libraryDependencies ++= ModuleDependencies.ZMQDependencies,
        assemblyJarName in assembly := "fey_zmq.jar"
    ))

  lazy val virtual_sensor = Project(
    id = "fey-virtual-sensor",
    base = file("./performers/virtual_sensor"),
    settings = BasicSettings ++ VirtualSensorbuildSettings ++ Seq(
      libraryDependencies ++= ModuleDependencies.VirtualSensorDependencies,
      assemblyJarName in assembly := "fey-virtual-sensor.jar"
    ))
}
