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)
