/*
 * Copyright 2012 the original author or authors.
 *
 * 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.
 */

import org.opencord.gradle.rules.*
import org.yaml.snakeyaml.Yaml

allprojects {
    apply plugin: 'base'
    apply plugin: 'de.gesellix.docker'
    //apply plugin: 'com.tmiyamon.config'

    docker {
        // dockerHost = System.env.DOCKER_HOST ?: 'unix:///var/run/docker.sock'
        // dockerHost = System.env.DOCKER_HOST ?: 'https://192.168.99.100:2376'
        // certPath = System.getProperty('docker.cert.path') ?: "${System.getProperty('user.home')}/.docker/machine/machines/default"
        // authConfigPlain = [
        //   "username"       : "joe",
        //   "password"       : "some-pw-as-needed",
        //   "email"          : "joe@acme.com",
        //   "serveraddress"  : "https://index.docker.io/v1/"
        //  ]
    }
}

ext {

   // Deployment target config file (yaml format); this can be overwritten from the command line
    // using the -PdeployConfig=<file-path> syntax.
    deployConfig = project.hasProperty('deployConfig') ? project.getProperty('deployConfig') : './config/default.yml'

    println "Using deployment config: $deployConfig"
    File configFile = new File(deployConfig)
    def yaml = new Yaml()
    config = yaml.load(configFile.newReader())

    // Upstream registry to simplify filling out the comps table below
    upstreamReg = project.hasProperty('upstreamReg') ? project.getProperty('upstreamReg') : 'docker.io'

    // Target registry to be used to publish docker images needed for deployment
    targetReg = project.hasProperty('targetReg')
        ? project.getProperty('targetReg')
        : config.docker && config.docker.registry
            ? config.docker.registry
            : config.seedServer.ip
                ? config.seedServer.ip + ":5000"
                : 'localhost:5000'

    // The tag used to tag the docker images push to the target registry
    targetTag = project.hasProperty('targetTag')
        ? project.getProperty('targetTag')
        : config.docker && config.docker.imageVersion
            ? config.docker.imageVersion
            : 'candidate'
}


task buildOnosApps (type: Exec) {
    workingDir './apps'
    commandLine 'mvn', 'clean', 'install', '-U'
}

task copyLocalRepo (dependsOn: buildOnosApps, type: Exec) {
    workingDir './'
    commandLine 'cp', '-R', System.env.HOME + '/.m2/repository', '.'
}

task buildRepoImage (dependsOn: copyLocalRepo, type: Exec) {
    commandLine 'docker', 'build', '-t', 'opencord/mavenrepo', '.'
}

task tagMavenRepoImage (type: Exec) {
    commandLine 'docker', 'tag', 'opencord/mavenrepo', "$targetReg/mavenrepo:$targetTag"
}

task publishMavenRepoImage (type: Exec) {
    dependsOn tagMavenRepoImage
    commandLine 'docker', 'push', "$targetReg/mavenrepo:$targetTag"
}

List.metaClass.asParam = { prefix, sep ->
  if (delegate.size() == 0) {
    ""
  }
  String result = "--" + prefix + "="
  String p = ""
  delegate.each {
    result += p + "${it}"
    p = sep
  }
  result
}

List.metaClass.p = { value, name ->
  if (value != null && value != "") {
      delegate << name + "=" + value
  } else {
      delegate
  }
}

List.metaClass.p = { spec ->
  if (spec != null && spec != "") {
      delegate += spec
  } else {
      delegate
  }
}

// ~~~~~~~~~~~~~~~~~~~ Global tasks ~~~~~~~~~~~~~~~~~~~~~~~

task fetch {
    logger.info 'Nothing to fetch for me'
}

task buildImages {
    dependsOn buildOnosApps
    dependsOn copyLocalRepo
    dependsOn buildRepoImage
}

task publish {
    dependsOn publishMavenRepoImage
}

task deploy (type: Exec) {
        executable = "ansible-playbook"
        args = ["-i", config.seedServer.ip + ',']

        if ( config.seedServer.ansible_user != null && config.seedServer.ansible_user != "" ) {
            args = args << "--user=$config.seedServer.ansible_user"
        }

        def extraVars = []
        if (config.seedServer) {
            extraVars = extraVars.p(config.seedServer.extraVars)
                    .p(config.seedServer.ansible_ssh_pass, "ansible_ssh_pass")
                    .p(config.seedServer.ansible_sudo_pass, "ansible_sudo_pass")
                    .p(config.seedServer.domain, "domain")
	            .p(config.seedServer.ansible_ssh_port, "ansible_ssh_port")
        }

        if (config.otherServers) {
            extraVars = extraVars.p(config.otherServers.location, "prov_location")
                .p(config.otherServers.rolesPath, "prov_role_path")
                .p(config.otherServers.role, "prov_role")
        }

        if (config.docker) {
            extraVars = extraVars.p(config.docker.registry, "docker_registry")
                .p(config.docker.imageVersion, "docker_image_version")
        }

        def skipTags = [].p(config.seedServer.skipTags)

        args = args.p(skipTags.asParam("skip-tags", ",")).p(extraVars.asParam("extra-vars", " ")) << "mavenrepo.yml"   
}


// Depending on the version of the apps this will either make a release or publish a snapshot
task release (type: Exec) {
    workingDir './apps'
    commandLine 'mvn', 'clean', 'deploy'
}
