import java.nio.charset.StandardCharsets
import java.nio.file.Files
import org.yaml.snakeyaml.DumperOptions

plugins {
    id 'com.craigburke.client-dependencies' version '1.4.0'
    id 'org.springframework.boot' version '3.0.4'
    id 'io.spring.dependency-management'
}

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

dependencyManagement {
    dependencies {
        dependency "org.apache.logging.log4j:log4j-slf4j2-impl:$log4j_version"
        dependency "org.apache.logging.log4j:log4j-core:$log4j_version"
        dependency "org.apache.logging.log4j:log4j-api:$log4j_version"
    }
}

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

configurations {
    demoArtifacts.extendsFrom testRuntimeOnly
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web:3.0.4') {
        exclude module: "spring-boot-starter-logging"
        exclude module: "logback-classic"
    }
    implementation('org.springframework.boot:spring-boot-starter-log4j2')
    runtimeOnly("org.apache.logging.log4j:log4j-web:$log4j_version")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jackson_kotlin_version")
    implementation project(":client:rpc")
    implementation project(":client:jackson")
    implementation project(":finance:workflows")
    // TODO In the future remove -irs bit from the directory name. Currently it clashes with :finance:workflows (same for contracts).
    implementation project(":samples:irs-demo:cordapp:workflows-irs")

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

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

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

jar {
    from sourceSets.main.output
    dependsOn clientInstall
    archiveClassifier = 'thin'
}

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

task deployWebapps(type: Copy, dependsOn: ['jar', 'bootJar']) {
    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: [bootJar]) {
    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: [bootJar, 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)
}
