// Copyright 2019 The Nomulus Authors. All Rights Reserved.
//
// 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.

apply plugin: 'war'

def environment = rootProject.environment
def gcpProject = rootProject.gcpProject

// Set this directory before applying the appengine plugin so that the
// plugin will recognize this as an app-engine standard app (and also
// obtains the appengine-web.xml from the correct location)
project.convention.plugins['war'].webAppDirName =
        "../../core/src/main/java/google/registry/env/${environment}/${project.name}"

apply plugin: 'com.google.cloud.tools.appengine'

def coreResourcesDir = "${rootDir}/core/build/resources/main"

// Get the web.xml file for the service.
war {
    webInf {
        from "../../core/src/main/java/google/registry/env/common/${project.name}/WEB-INF"

        from("${coreResourcesDir}/META-INF/persistence.xml") {
            into "classes/META-INF"
        }
    }
}

war {
    from("${coreResourcesDir}/google/registry/ui/html") {
        include "*.html"
    }
}

if (project.path == ":services:default") {
    war {
        from("${coreResourcesDir}/google/registry/ui") {
            include "registrar_bin.js"
            if (environment != "production") {
                include "registrar_bin.js.map"
            }
            into("assets/js")
        }
        from("${coreResourcesDir}/google/registry/ui/css") {
            include "registrar*"
            into("assets/css")
        }
        from("${coreResourcesDir}/google/registry/ui/assets/images") {
            include "**/*"
            into("assets/images")
        }
    }
}

appengine {
    deploy {
        // appengineDeployAll task requires the version to be set. So,
        // this config lets gcloud select a version name when deploying
        // to alpha or sandbox from our workstation.
        if (!rootProject.prodOrSandboxEnv) {
            version = 'GCLOUD_CONFIG'
        }

        // Don't set gcpProject directly, it gets overriden in ./build.gradle.
        // Do -P environment={crash,alpha} instead.  For sandbox/production,
        // use Spinnaker.
        projectId = gcpProject
    }
}

dependencies {
    compile project(path: ':core', configuration: 'deploy_jar')
}

// The tools.jar file gets pulled in from the java environment and for some
// reason gets exploded "readonly", causing subsequent builds to fail when
// they can't overwrite it.  The hack below makes the file writable after
// we're done exploding it.
//
// Fun fact: We only use this jar for documentation generation and as such we
// don't need it in our warfile, as it is not used by the application at
// runtime.  But it's not clear how to exclude it, as we seem to be
// constructing the jar from the entire WEB-INF directory and per-file
// exclude rules don't seem to work on it.  Better solutions are welcome :-)
explodeWar.doLast {
    file("${it.explodedAppDirectory}/WEB-INF/lib/tools.jar").setWritable(true)
}

rootProject.deploy.dependsOn appengineDeployAll
rootProject.stage.dependsOn appengineStage

// Impose verification for all of the deployment tasks.  We haven't found a
// better way to do this other than to apply to each of them independently.
// If a new task gets added, it will still fail if "environment"  is not defined
// because gcpProject is null.  We just won't get as friendly an error message.
appengineDeployAll.configure rootProject.verifyDeploymentConfig
appengineDeploy.configure rootProject.verifyDeploymentConfig
appengineDeployCron.configure rootProject.verifyDeploymentConfig
appengineDeployDispatch.configure rootProject.verifyDeploymentConfig
appengineDeployDos.configure rootProject.verifyDeploymentConfig
appengineDeployIndex.configure rootProject.verifyDeploymentConfig
appengineDeployQueue.configure rootProject.verifyDeploymentConfig
