/*
 * Copyright [2017] [B2W Digital]
 *
 * 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.
 *
 */
name := "marvin-engine-executor"

version := "0.0.4"

scalaVersion := "2.12.3"

organization := "com.github.marvin-ai"

PB.targets in Compile := Seq(
  scalapb.gen() -> (sourceManaged in Compile).value
)

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-http" % "10.0.10",
  "com.typesafe.akka" %% "akka-http-spray-json" % "10.0.10",
  "org.clapper"       %% "grizzled-slf4j" % "1.3.0",
  "com.typesafe.akka" %% "akka-http-testkit" % "10.0.10" % Test,
  "org.scalatest"     %% "scalatest"     % "3.0.1" % Test,
  "org.scalamock"     %% "scalamock-scalatest-support" % "3.5.0" % Test,
  "com.typesafe.akka" %% "akka-cluster" % "2.5.9"
)

libraryDependencies ++= Seq (
  "io.grpc" % "grpc-netty" % com.trueaccord.scalapb.compiler.Version.grpcJavaVersion,
  "com.trueaccord.scalapb" %% "scalapb-runtime-grpc" % com.trueaccord.scalapb.compiler.Version.scalapbVersion
)

libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.7.4"
libraryDependencies += "io.spray" %%  "spray-json" % "1.3.3"
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.0"
libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.0"
libraryDependencies += "org.json4s" %% "json4s-jackson" % "3.5.0"
libraryDependencies += "com.github.java-json-tools" % "json-schema-validator" % "2.2.8"
libraryDependencies += "io.jvm.uuid" %% "scala-uuid" % "0.2.3"
libraryDependencies += "com.amazonaws" % "aws-java-sdk-s3" % "1.11.232"

dependencyOverrides ++= Set(
  "io.netty" %% "netty" % "3.7.0",
  "io.netty" %% "netty-handler-proxy" % "4.1.12",
  "com.google.guava" %% "guava" % "19.0"
)

libraryDependencies += "com.github.cb372" %% "scalacache-guava" % "0.22.0"

mainClass in (Compile, run) := Some("org.marvin.executor.EngineExecutorApp")
mainClass in assembly := Some("org.marvin.executor.EngineExecutorApp")

assemblyMergeStrategy in assembly := {
  case PathList("org", "apache", xs @_*) => MergeStrategy.first
  case PathList("io", "netty", xs @_*) => MergeStrategy.first
  case "META-INF/io.netty.versions.properties" => MergeStrategy.first
  case x => {
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
  }
}

publishTo := {
  val nexus = "https://oss.sonatype.org/"
  if (isSnapshot.value)
    Some("snapshots" at nexus + "content/repositories/snapshots")
  else
    Some("releases"  at nexus + "service/local/staging/deploy/maven2")
}

publishArtifact in Test := false

useGpg := true