import SharedSettings._
import sbtassembly.AssemblyPlugin.autoImport._
import sbtdocker.DockerPlugin.autoImport._

lazy val common = (project in file("common"))
  .settings(commonSettings: _*)
  .settings(assembleArtifact in assembly := false)

lazy val analyticsETLGitCommits = (project in file("gitcommits"))
  .enablePlugins(GitVersioning)
  .enablePlugins(DockerPlugin)
  .settings(commonSettings: _*)
  .settings(commonDockerSettings(projectName = "gitcommits"))
  .settings(
    dockerfile in docker := {
      val artifact: File = assembly.value
      val entryPointBase = s"/app"

      baseDockerfile(projectName = "gitcommits",
                     artifact,
                     artifactTargetPath = s"$entryPointBase/${name.value}-assembly.jar")
        .copy(baseDirectory(_ / "scripts" / "gerrit-analytics-etl-gitcommits.sh").value,
              file(s"$entryPointBase/gerrit-analytics-etl-gitcommits.sh"))
        .copy(baseDirectory(_ / "scripts" / "wait-for-elasticsearch.sh").value,
              file(s"$entryPointBase/wait-for-elasticsearch.sh"))
        .cmd(s"/bin/sh", s"$entryPointBase/gerrit-analytics-etl-gitcommits.sh")
    }
  )
  .dependsOn(common % "compile->compile;test->test")

lazy val analyticsETLAuditLog = (project in file("auditlog"))
  .enablePlugins(GitVersioning)
  .enablePlugins(DockerPlugin)
  .settings(commonSettings: _*)
  .settings(commonDockerSettings(projectName = "auditlog"))
  .settings(
    dockerfile in docker := {
      val artifact: File = assembly.value
      val entryPointBase = s"/app"
      baseDockerfile(projectName = "auditlog",
                     artifact,
                     artifactTargetPath = s"$entryPointBase/${name.value}-assembly.jar")
        .copy(baseDirectory(_ / "scripts" / "gerrit-analytics-etl-auditlog.sh").value,
              file(s"$entryPointBase/gerrit-analytics-etl-auditlog.sh"))
        .copy(baseDirectory(_ / "scripts" / "wait-for-elasticsearch.sh").value,
              file(s"$entryPointBase/wait-for-elasticsearch.sh"))
        .volume(s"$entryPointBase/events/")
        .volume(s"$entryPointBase/data/")
        .cmd(s"/bin/sh", s"$entryPointBase/gerrit-analytics-etl-auditlog.sh")
    }
  )
  .dependsOn(common % "compile->compile;test->test")

lazy val root = (project in file("."))
  .disablePlugins(AssemblyPlugin)
  .settings(test in assembly := {})
  .aggregate(analyticsETLGitCommits, analyticsETLAuditLog)
