// Copyright (C) 2017 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.model

import java.time.format.DateTimeFormatter
import java.time.{LocalDate, ZoneOffset}

import com.gerritforge.analytics.gitcommits.api.GerritConnectivity
import com.gerritforge.analytics.gitcommits.support.ops.AnalyticsTimeOps.AnalyticsDateTimeFormater

case class GerritEndpointConfig(
    baseUrl: Option[String] = None,
    prefix: Option[String] = None,
    outputDir: String =
      s"file://${System.getProperty("java.io.tmpdir")}/analytics-${System.nanoTime()}",
    elasticIndex: Option[String] = None,
    since: Option[LocalDate] = None,
    until: Option[LocalDate] = None,
    aggregate: Option[String] = None,
    emailAlias: Option[String] = None,
    eventsPath: Option[String] = None,
    eventsFailureOutputPath: Option[String] = None,
    username: Option[String] = None,
    password: Option[String] = None,
    extractBranches: Option[Boolean] = None) {

  val gerritApiConnection: GerritConnectivity = new GerritConnectivity(username, password)

  val gerritProjectsUrl: Option[String] = baseUrl.map { url =>
    s"${url}/projects/" + prefix.fold("")("?p=" + _)
  }

  def queryOpt(opt: (String, Option[String])): Option[String] = {
    opt match {
      case (name: String, value: Option[String]) => value.map(name + "=" + _)
    }
  }

  @transient
  private lazy val format: DateTimeFormatter =
    AnalyticsDateTimeFormater.yyyy_MM_dd.withZone(ZoneOffset.UTC)
  val queryString = Seq(
    "since"            -> since.map(format.format),
    "until"            -> until.map(format.format),
    "aggregate"        -> aggregate,
    "extract-branches" -> extractBranches.map(_.toString)
  ).flatMap(queryOpt).mkString("?", "&", "")

  def contributorsUrl(projectName: String): Option[String] =
    baseUrl.map { url =>
      s"$url/projects/$projectName/analytics~contributors$queryString"
    }
}
