// Copyright (C) 2018 GerritForge Ltd
//
// 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.

package com.gerritforge.analytics.gitcommits.engine.events

import com.gerritforge.analytics.SparkTestSupport
import com.gerritforge.analytics.gitcommits.engine.GerritAnalyticsTransformations.{
  CommitInfo,
  UserActivitySummary
}
import com.gerritforge.analytics.gitcommits.engine.events.GerritEventsTransformations.NotParsableJsonEvent
import org.apache.spark.rdd.RDD
import org.scalatest.{Inside, Matchers, WordSpec}

class GerritEventsTransformationsSpec
    extends WordSpec
    with Matchers
    with SparkTestSupport
    with Inside
    with EventFixture {

  "tryParseGerritTriggeredEvent" should {

    implicit val eventParser: GerritJsonEventParser = EventParser

    "Parse a correctly formed event" in new EventFixture {
      GerritEventsTransformations.tryParseGerritTriggeredEvent(refUpdated.json) shouldBe Right(
        refUpdated.event)
    }

    "Return a description of the failure in with the original event source a Left object if the JSON provided is invalid" in {
      val invalidJson = "invalid json string"
      GerritEventsTransformations.tryParseGerritTriggeredEvent(invalidJson) shouldBe Left(
        NotParsableJsonEvent(invalidJson, "unknown token i - Near: i"))
    }

    "Return a description of the failure with the original event source  in a Left object if the JSON event is not supported" in {
      val unsupportedEvent = """{"type":"ref-updated-UNSUPPORTED","eventCreatedOn":1516531868}"""

      GerritEventsTransformations.tryParseGerritTriggeredEvent(unsupportedEvent) shouldBe Left(
        NotParsableJsonEvent(unsupportedEvent, "Unsupported event type 'ref-updated-UNSUPPORTED'"))
    }
  }

  "PimpedJsonRDD" should {
    "Convert an RDD of JSON events into an RDD of events or unparsed json strings" in {
      val jsonRdd = sc.parallelize(Seq(refUpdated.json, changeMerged.json, "invalid json string"))

      import GerritEventsTransformations._

      jsonRdd.parseEvents(EventParser).collect() should contain only (
        Right(refUpdated.event),
        Right(changeMerged.event),
        Left(NotParsableJsonEvent("invalid json string", "unknown token i - Near: i"))
      )
    }
  }

  "extractUserActivitySummary" should {
    implicit val eventParser: GerritJsonEventParser = EventParser

    "Build one UserActivitySummary object if given a series of non-merge commits" in {
      val events: Seq[ChangeMergedEvent] = Seq(
        aChangeMergedEvent("1",
                           1001l,
                           newRev = "rev1",
                           insertions = 2,
                           deletions = 1,
                           branch = "stable-1.14"),
        aChangeMergedEvent("2",
                           1002l,
                           newRev = "rev2",
                           insertions = 3,
                           deletions = 0,
                           branch = "stable-1.14"),
        aChangeMergedEvent("3",
                           1003l,
                           newRev = "rev3",
                           insertions = 1,
                           deletions = 4,
                           branch = "stable-1.14"),
        aChangeMergedEvent("4",
                           1004l,
                           newRev = "rev4",
                           insertions = 0,
                           deletions = 2,
                           branch = "stable-1.14"),
        aChangeMergedEvent("5",
                           1005l,
                           newRev = "rev5",
                           insertions = 1,
                           deletions = 1,
                           branch = "stable-1.14")
      ).map(_.event)

      val summaries: Iterable[UserActivitySummary] =
        GerritEventsTransformations.extractUserActivitySummary(
          changes = events,
          year = 2018,
          month = 1,
          day = 10,
          hour = 1
        )

      summaries should have size 1

      inside(summaries.head) {
        case UserActivitySummary(year,
                                 month,
                                 day,
                                 hour,
                                 name,
                                 email,
                                 num_commits,
                                 _,
                                 _,
                                 added_lines,
                                 deleted_lines,
                                 commits,
                                 branches,
                                 last_commit_date,
                                 is_merge) =>
          year shouldBe 2018
          month shouldBe 1
          day shouldBe 10
          hour shouldBe 1
          name shouldBe "Administrator"
          email shouldBe "admin@example.com"
          num_commits shouldBe events.size
          last_commit_date shouldBe 1005000l
          is_merge shouldBe false
          added_lines shouldBe 7
          deleted_lines shouldBe 8
          commits should contain only (
            CommitInfo("rev1", 1001000l, false),
            CommitInfo("rev2", 1002000l, false),
            CommitInfo("rev3", 1003000l, false),
            CommitInfo("rev4", 1004000l, false),
            CommitInfo("rev5", 1005000l, false)
          )
          branches should contain only "stable-1.14"
      }
    }

    "Build two UserActivitySummaries object if given a mixed series of merge and non merge commits" in {
      val events: Seq[ChangeMergedEvent] = Seq(
        aChangeMergedEvent("1", 1001l, newRev = "rev1", isMergeCommit = true),
        aChangeMergedEvent("2", 1002l, newRev = "rev2"),
        aChangeMergedEvent("3", 1003l, newRev = "rev3", isMergeCommit = true),
        aChangeMergedEvent("4", 1004l, newRev = "rev4"),
        aChangeMergedEvent("5", 1005l, newRev = "rev5")
      ).map(_.event)

      val summaries: Iterable[UserActivitySummary] =
        GerritEventsTransformations.extractUserActivitySummary(
          changes = events,
          year = 2018,
          month = 1,
          day = 10,
          hour = 1
        )

      summaries should have size 2

      summaries.foreach { summary =>
        inside(summary) {
          case UserActivitySummary(year,
                                   month,
                                   day,
                                   hour,
                                   name,
                                   email,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _) =>
            year shouldBe 2018
            month shouldBe 1
            day shouldBe 10
            hour shouldBe 1
            name shouldBe "Administrator"
            email shouldBe "admin@example.com"
        }
      }

      summaries.foreach { summary =>
        inside(summary) {
          case UserActivitySummary(_,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _,
                                   num_commits,
                                   _,
                                   _,
                                   _,
                                   _,
                                   commits,
                                   _,
                                   last_commit_date,
                                   false) =>
            num_commits shouldBe 3
            last_commit_date shouldBe 1005000l
            commits should contain only (
              CommitInfo("rev2", 1002000l, false),
              CommitInfo("rev4", 1004000l, false),
              CommitInfo("rev5", 1005000l, false)
            )

          case UserActivitySummary(_,
                                   _,
                                   _,
                                   _,
                                   _,
                                   _,
                                   num_commits,
                                   _,
                                   _,
                                   _,
                                   _,
                                   commits,
                                   _,
                                   last_commit_date,
                                   true) =>
            num_commits shouldBe 2
            last_commit_date shouldBe 1003000l
            commits should contain only (
              CommitInfo("rev1", 1001000l, true),
              CommitInfo("rev3", 1003000l, true)
            )
        }
      }

    }
  }

  "Pimped Per Project UserActivitySummary RDD" should {
    "Allow conversion to a DataFrame equivalent to what extracted from the Analytics plugin" in {
      import GerritEventsTransformations._
      import com.gerritforge.analytics.gitcommits.engine.GerritAnalyticsTransformations._
      import spark.implicits._

      val aliasDF = sc
        .parallelize(
          Seq(
            ("stefano_alias", "stefano@galarraga-org.com", "")
          ))
        .toDF("author", "email", "organization")

      val expectedDate = System.currentTimeMillis

      val analyticsJobOutput =
        sc.parallelize(
            Seq(
              "project1" -> UserActivitySummary(
                2018,
                1,
                20,
                10,
                "Stefano",
                "stefano@galarraga-org.com",
                1,
                2,
                1,
                10,
                4,
                Array(CommitInfo("sha1", expectedDate, false)),
                Array("master", "stable-2.14"),
                expectedDate,
                false
              )
            ))
          .asEtlDataFrame(sql)
          .addOrganization()
          .handleAliases(Some(aliasDF))
          .dropCommits

      val expected = sc
        .parallelize(
          Seq(
            ("project1",
             "stefano_alias",
             "stefano@galarraga-org.com",
             2018,
             1,
             20,
             10,
             2,
             1,
             10,
             4,
             1,
             expectedDate,
             false,
             Array("master", "stable-2.14"),
             "galarraga-org")
          ))
        .toDF(
          "project",
          "author",
          "email",
          "year",
          "month",
          "day",
          "hour",
          "num_files",
          "num_distinct_files",
          "added_lines",
          "deleted_lines",
          "num_commits",
          "last_commit_date",
          "is_merge",
          "branches",
          "organization"
        )

      val collected = analyticsJobOutput.collect()

      collected should contain theSameElementsAs expected.collect()
    }
  }

  "removeEventsForCommits" should {
    "remove any event modifying a gerrit repo to go toward the commits to be excluded" in {
      import GerritEventsTransformations._

      val toKeep1 = aRefUpdatedEvent("oldRev", "RevToKeep")
      val toKeep2 = aChangeMergedEvent(changeId = "changeId2", newRev = "RevToKeep2")
      val events: RDD[GerritRefHasNewRevisionEvent] = sc.parallelize(
        Seq(
          aRefUpdatedEvent("oldRev", "RevToExclude1"),
          toKeep1,
          aRefUpdatedEvent("oldRev", "RevToExclude2"),
          aChangeMergedEvent(changeId = "changeId1", newRev = "RevToExclude3"),
          toKeep2
        ).map(_.event))

      events
        .removeEventsForCommits(
          sc.parallelize(Seq("RevToExclude1", "RevToExclude2", "RevToExclude3")))
        .collect() should contain only (toKeep1.event, toKeep2.event)
    }
  }
}

trait EventFixture {

  // Forcing early type failures
  case class JsonEvent[T <: GerritJsonEvent](json: String) {
    val event: T = EventParser.fromJson(json).get.asInstanceOf[T]
  }

  val refUpdated: JsonEvent[RefUpdatedEvent] = aRefUpdatedEvent(
    oldRev = "863b64002f2a9922deba69407804a44703c996e0",
    newRev = "d3131be8d7c920badd28b70d8c039682568c8de5")

  val changeMerged: JsonEvent[ChangeMergedEvent] = aChangeMergedEvent(
    "I5e6b5a3bbe8a29fb0393e4a28da536e0a198b755")

  def aRefUpdatedEvent(oldRev: String, newRev: String, createdOn: Long = 1000l) =
    JsonEvent[RefUpdatedEvent](
      s"""{"submitter":{"name":"Administrator","email":"admin@example.com","username":"admin"},
       | "refUpdate":{"oldRev":"$oldRev",
       | "newRev":"$newRev",
       | "refName": "refs/heads/master","project":"subcut"},
       |"type":"ref-updated","eventCreatedOn":$createdOn}""".stripMargin)

  def aChangeMergedEvent(changeId: String,
                         createdOnInSecs: Long = 1000l,
                         newRev: String = "863b64002f2a9922deba69407804a44703c996e0",
                         isMergeCommit: Boolean = false,
                         insertions: Integer = 0,
                         deletions: Integer = 0,
                         branch: String = "master") =
    JsonEvent[ChangeMergedEvent](
      s"""{
       |"submitter":{"name":"Administrator","email":"admin@example.com","username":"admin"},
       |"newRev":"$newRev",
       |"patchSet":{
       | "number":1,
       | "revision":"$newRev",
       | "parents": ${if (isMergeCommit)
           """["4a4e59272f1f88824d805c0f4233c1ee7331e986", "4a4e59272f1f88824d805c0f4233c1ee7331e987"]"""
         else """["4a4e59272f1f88824d805c0f4233c1ee7331e986"]"""},
       | "ref":"refs/changes/01/1/1",
       | "uploader":{"name":"Administrator","email":"admin@example.com","username":"admin"},
       | "createdOn":1516530259,
       | "author":{"name":"Stefano Galarraga","email":"galarragas@gmail.com","username":""},
       | "isDraft":false,
       | "kind":"REWORK",
       | "sizeInsertions":$insertions,
       | "sizeDeletions":$deletions
       |},
       |"change":{
       | "project":"subcut","branch":"$branch","topic":"TestEvents","id":"$changeId","number":1,"subject":"Generating some changes to test events",
       | "owner":{"name":"Administrator","email":"admin@example.com","username":"admin"},
       | "url":"http://842860da5b33:8080/1","commitMessage":"Generating some changes to test events Change-Id: $changeId",
       | "createdOn":1516530259,"status":"MERGED"
       |},
       |"project":{"name":"subcut"},
       |"refName":"refs/heads/$branch",
       |"changeKey":{"id":"$changeId"},
       |"type":"change-merged",
       |"eventCreatedOn": $createdOnInSecs
       |}""".stripMargin)

}
