package com.googlesource.gerrit.plugins.analytics.wizard

import java.io.File
import java.net.URL
import java.nio.file.Path
import java.time.LocalDate
import java.time.format.DateTimeFormatter

import com.googlesource.gerrit.plugins.analytics.wizard.model.AggregationType.{Email, EmailYear}
import com.googlesource.gerrit.plugins.analytics.wizard.model.ETLConfig
import org.scalatest.{FlatSpec, Matchers}

class AnalyticDashboardSetupSpec extends FlatSpec with Matchers {
  behavior of "AnalyticDashboardSetup"

  it should "create a config file with correct name" in {
    var gotFilename: Option[Path] = None
    class MockWriter extends ConfigWriter {
      override def write(filename: Path, out: String): Unit = {
        gotFilename = Some(filename)
      }
    }
    implicit val writer = new MockWriter()

    val composeYamlFile = File.createTempFile(getClass.getName, ".yaml").toPath
    val ads =
      AnalyticDashboardSetup("aProject",
                             composeYamlFile,
                             new URL("http://gerrit_local_ip_address:8080"),
                             ETLConfig(Email, None, None, None, None, None, None, None, None))
    ads.createDashboardSetupFile()
    gotFilename shouldBe Some(composeYamlFile)
  }

  it should "create a config file with correct analytics args" in {
    var gotFilename: Option[Path] = None
    var dockerCompose: String     = ""
    class MockWriter extends ConfigWriter {
      override def write(filename: Path, out: String): Unit = {
        gotFilename = Some(filename)
        dockerCompose = out
      }
    }
    implicit val writer = new MockWriter()

    val dateSince       = "2018-10-10"
    val localDateSince  = LocalDate.parse(dateSince, DateTimeFormatter.ofPattern("yyyy-MM-dd"))
    val dateUntil       = "2018-10-20"
    val localDateUntil  = LocalDate.parse(dateUntil, DateTimeFormatter.ofPattern("yyyy-MM-dd"))
    val prefix          = "myProjectPrefix"
    val password        = "myPassword"
    val username        = "myUsername"
    val composeYamlFile = File.createTempFile(getClass.getName, ".yaml").toPath
    val ads =
      AnalyticDashboardSetup(
        "aProject",
        composeYamlFile,
        new URL("http://gerrit_local_ip_address:8080"),
        ETLConfig(EmailYear,
                  Some(prefix),
                  Some(localDateSince),
                  Some(localDateUntil),
                  None,
                  None,
                  None,
                  Some(username),
                  Some(password))
      )
    ads.createDashboardSetupFile()
    gotFilename shouldBe Some(composeYamlFile)
    dockerCompose should include("--aggregate email_year")
    dockerCompose should include(s"--until $dateUntil")
    dockerCompose should include(s"--since $dateSince")
    dockerCompose should include(s"--prefix $prefix")
    dockerCompose should include(s"--password $password")
    dockerCompose should include(s"--username $username")
  }
}
