/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "cz.alenkacz:gradle-scalafmt:${gradle.scalafmt.version}"
    }
}

plugins {
    id "com.gradle.build-scan" version "2.3"
    id "org.scoverage" version "3.1.5" apply false
}


buildScan {
    termsOfServiceUrl = 'https://gradle.com/terms-of-service'
    termsOfServiceAgree = 'yes'
    publishAlwaysIf(System.getenv('CI') != null)
}

subprojects {
    apply plugin: 'scalafmt'
    scalafmt.configFilePath = gradle.scalafmt.config

    group 'org.apache.openwhisk'
    version '1.0.0-SNAPSHOT'

    pluginManager.withPlugin('scala') {
        // Constraint all transitive akka-* dependencies to the one we want to use to avoid issues.
        // List generated via
        // ./gradlew :test:dependencies | grep -o 'akka-.*_' | cut -c 6- | rev | cut -c 2- | rev | sort -u
        def cons = project.getDependencies().getConstraints()
        def akka = ['akka-actor', 'akka-cluster', 'akka-cluster-metrics', 'akka-cluster-tools', 'akka-coordination',
                    'akka-discovery', 'akka-distributed-data', 'akka-protobuf', 'akka-remote', 'akka-slf4j',
                    'akka-stream', 'akka-stream-testkit', 'akka-testkit']
        def akkaHttp = ['akka-http', 'akka-http-core', 'akka-http-spray-json', 'akka-http-testkit', 'akka-http-xml',
                        'akka-parsing']

        akka.forEach {
            cons.add('compile', "com.typesafe.akka:${it}_${gradle.scala.depVersion}:${gradle.akka.version}")
        }
        akkaHttp.forEach {
            cons.add('compile', "com.typesafe.akka:${it}_${gradle.scala.depVersion}:${gradle.akka_http.version}")
        }
    }

    afterEvaluate {
        if (project.plugins.hasPlugin('scala')) {
            repositories {
                mavenCentral()
            }

            tasks.withType(ScalaCompile) {
                scalaCompileOptions.additionalParameters = gradle.scala.compileFlags
                scalaCompileOptions.forkOptions.jvmArgs = ["-Xss2m"]
            }

            if (project.plugins.hasPlugin('application')) {
                startScripts {
                    doLast {
                        unixScript.text = configureUnixClasspath(unixScript)
                    }
                }
            }
        }

        if (project.plugins.hasPlugin('maven')) {
            task sourcesJar(type: Jar, dependsOn: classes) {
                classifier = 'sources'
                from sourceSets.main.allSource
            }

            task testSourcesJar(type: Jar, dependsOn: testClasses) {
                classifier = 'test-sources'
                from sourceSets.test.allSource
                exclude("logback-test.xml")
            }

            task testClassesJar(type: Jar, dependsOn: testClasses) {
                classifier = 'tests'
                from sourceSets.test.output
            }

            artifacts {
                archives sourcesJar
                archives testSourcesJar
                archives testClassesJar
            }
        }

        if (project.plugins.hasPlugin('application')) {
            //Ensure that dist archive name does not contain version
            distTar {
                archiveName = "${project.name}.tar"
            }

            //Avoid generating the zip files from maven installations
            distZip {
                enabled false
            }

            configurations.archives.artifacts.removeAll {it.file =~ 'zip'}
        }
    }
}

def configureUnixClasspath(File script) {
    script
        .readLines()
        .collect { line ->
            // Looking for the line that starts with CLASSPATH=
            line = line.replaceAll(~/^CLASSPATH=.*$/) { original ->

                // Get original line and append it
                // with the configuration directory.
                original += ':$APP_HOME/ext-lib/*:$APP_HOME/config'
                //Ensure classes comes first. Used to refer to instrumented classes for code coverage
                original = original.replace('CLASSPATH=', 'CLASSPATH=$APP_HOME/classes:')
            }
        }
        .join('\n')
}
