// 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.common.api

import java.net.URL

import com.typesafe.scalalogging.LazyLogging
import javax.net.ssl.{HttpsURLConnection, SSLContext}
import org.apache.commons.codec.binary.Base64

import scala.io.{BufferedSource, Codec, Source}

sealed trait HttpBasicAuthentication {

  val BASIC = "Basic"
  val AUTHORIZATION = "Authorization"

  def encodeCredentials(username: String, password: String): String = {
    new String(Base64.encodeBase64String((username + ":" + password).getBytes))
  }

  def getHeader(username: String, password: String): String =
    BASIC + " " + encodeCredentials(username, password)
}

class GerritConnectivity(maybeUsername: Option[String], maybePassword: Option[String], ignoreSSLCert: Boolean = false) extends HttpBasicAuthentication with Serializable with LazyLogging {
  private def createBasicSecuredConnection(url: String, username: String, password: String): BufferedSource = {
    try {
      if(ignoreSSLCert) trustAllSSLCerts()

      val unsecureURL = new URL(url)
      val endPointPath = unsecureURL.getFile
      val basicAuthURL = unsecureURL.toString.replace(endPointPath, s"/a$endPointPath")

      logger.info(s"Connecting to API $basicAuthURL with basic auth")

      val connection = new URL(basicAuthURL).openConnection
      connection.setRequestProperty(AUTHORIZATION, getHeader(username, password))
      Source.fromInputStream(connection.getInputStream, Codec.UTF8.name)
    }
    catch {
      case e: Exception => throw new Exception(s"Unable to connect to $url. $e")
    }
  }

  private def createNonSecuredConnection(url: String): BufferedSource = {
    if(ignoreSSLCert) trustAllSSLCerts()

    logger.info(s"Connecting to API $url")
    Source.fromURL(url, Codec.UTF8.name)
  }

  def getContentFromApi(url: String): BufferedSource = {
    (
      for {
        username <- maybeUsername
        password <- maybePassword
      } yield (createBasicSecuredConnection(url, username, password))
      ).getOrElse(createNonSecuredConnection(url))
  }

  private def trustAllSSLCerts(): Unit = {
    logger.warn("Trusting all SSL certificates")
    val sslContext = SSLContext.getInstance("SSL")
    sslContext.init(null, Array(TrustAll), new java.security.SecureRandom())
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory)
    HttpsURLConnection.setDefaultHostnameVerifier(VerifiesAllHostNames)
  }
}
