import java.nio.charset.StandardCharsets
import java.nio.file.Files


buildscript {
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
		classpath "io.spring.gradle:dependency-management-plugin:1.0.4.RELEASE"
		classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
		classpath 'com.bmuschko:gradle-docker-plugin:3.2.1'
		classpath "org.yaml:snakeyaml:1.19"
	}
}

import org.yaml.snakeyaml.DumperOptions

plugins {
	id 'com.craigburke.client-dependencies' version '1.4.0'
}

group = "${parent.group}.irs-demo"

clientDependencies {
    registry 'realBower', type:'bower', url:'https://registry.bower.io'
    realBower {
        "angular"("1.5.8")
        "jquery"("^3.0.0")
        "angular-route"("1.5.8")
        "lodash"("^4.13.1")
        "angular-fcsa-number"("^1.5.3")
        "jquery.maskedinput"("^1.4.1")
        "requirejs"("^2.2.0")
        "semantic-ui"("^2.2.2", into: "semantic")
    }

    // put the JS dependencies into src directory so it can easily be referenced
    // from HTML files in webapp frontend, useful for testing/development
    // Note that this dir is added to .gitignore
    installDir = 'src/main/resources/static/js/bower_components'
}

// Spring Boot plugin adds a numerous hardcoded dependencies in the version much lower then Corda expects
// causing the problems in runtime. Those can be changed by manipulating above properties
// See https://github.com/spring-gradle-plugins/dependency-management-plugin/blob/master/README.md#changing-the-value-of-a-version-property
ext['artemis.version'] = "$artemis_version"
ext['hibernate.version'] = "$hibernate_version"
ext['jackson.version'] = "$jackson_version"

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'project-report'
apply plugin: 'application'

configurations {
    demoArtifacts.extendsFrom testRuntime
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web') {
        exclude module: "spring-boot-starter-logging"
        exclude module: "logback-classic"
    }
	compile('org.springframework.boot:spring-boot-starter-log4j2')
    runtime("org.apache.logging.log4j:log4j-web:$log4j_version")
    compile("com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_version")
    compile project(":client:rpc")
    compile project(":client:jackson")
	compile project(":samples:irs-demo:cordapp")

    testCompile project(":test-utils")
    testCompile project(path: ":samples:irs-demo:cordapp", configuration: "demoArtifacts")

	// JOpt: for command line flags.
    compile "net.sf.jopt-simple:jopt-simple:$jopt_simple_version"

    testCompile('org.springframework.boot:spring-boot-starter-test') {
        exclude module: "spring-boot-starter-logging"
        exclude module: "logback-classic"
    }
}

jar {
    from sourceSets.main.output
    dependsOn clientInstall
}

def docker_dir = file("$project.buildDir/docker")

task deployWebapps(type: Copy, dependsOn: ['jar', 'bootRepackage']) {
    ext.webappDir = file("build/webapps")

    from(jar.outputs)
    from("src/test/resources/scripts/") {
        filter { it
                .replace('#JAR_PATH#', jar.archiveName)
                .replace('#DIR#', ext.webappDir.getAbsolutePath())
        }
    }
    into ext.webappDir
}

task demoJar(type: Jar) {
    classifier "test"
    from sourceSets.test.output
}

artifacts {
    demoArtifacts demoJar
}

task createDockerfile(type: com.bmuschko.gradle.docker.tasks.image.Dockerfile, dependsOn: [bootRepackage]) {
	destFile = file("$docker_dir/Dockerfile")

	from 'azul/zulu-openjdk-alpine:8u152'
	copyFile jar.archiveName, "/opt/irs/web/"
	workingDir "/opt/irs/web/"
	defaultCommand "sh", "-c", "java -Dcorda.host=\$CORDA_HOST -jar ${jar.archiveName}"
}

task prepareDockerDir(type: Copy, dependsOn: [bootRepackage, createDockerfile]) {
	from jar
	into docker_dir
}

task generateDockerCompose(dependsOn: [prepareDockerDir]) {

	def outFile = new File(project.buildDir, "docker-compose.yml")

	ext['dockerComposePath'] = outFile

	doLast {
		def dockerComposeObject = [
			"version": "3",
			"services": [
				"web-a": [
					"build": "$docker_dir".toString(),
					"environment": [
						"CORDA_HOST": "bank-a:10003"
					],
					"ports": ["8080"]
				],
				"web-b": [
					"build": "$docker_dir".toString(),
					"environment": [
						"CORDA_HOST": "bank-b:10003"
					],
					"ports": ["8080"]
				]
			]
		]


		def options = new org.yaml.snakeyaml.DumperOptions()
		options.indent = 2
		options.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK

		def dockerComposeContent = new org.yaml.snakeyaml.Yaml(options).dump(dockerComposeObject)

		Files.write(outFile.toPath(), dockerComposeContent.getBytes(StandardCharsets.UTF_8))
	}

    outputs.file(outFile)
}