import net.corda.plugins.Cordform

apply plugin: 'org.jetbrains.kotlin.jvm'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.cordformation'

cordapp {
    targetPlatformVersion corda_platform_version.toInteger()
}

dependencies {
    if (System.getProperty('excludeShell') == null) {
        cordaDriver "net.corda:corda-shell:$corda_shell_version"
    }

    cordaProvided project(':core')
    cordaProvided project(':client:rpc')

    cordaBootstrapper "org.slf4j:slf4j-simple:$slf4j_version"
    cordaBootstrapper project(":node-api")

    // Corda integration dependencies
    corda project(path: ":node:capsule", configuration: 'runtimeArtifacts')
    corda project(path: ":testing:testserver:testcapsule:", configuration: 'runtimeArtifacts')

    // Notary implementations
    cordapp project(':samples:notary-demo:contracts')
    cordapp project(':samples:notary-demo:workflows')
}

task deployNodes(dependsOn: ['deployNodesSingle', 'deployNodesRaft', 'deployNodesBFT', 'deployNodesCustom'])

configurations.cordaCordapp.canBeResolved = true
task deployNodesSingle(type: Cordform) {
    directory file("$buildDir/nodes/nodesSingle")
    nodeDefaults {
        projectCordapp {
            deploy = false
        }
        extraConfig = [h2Settings: [address: "localhost:0"]]
        cordapp project(':samples:notary-demo:contracts')
        cordapp project(':samples:notary-demo:workflows')
        runSchemaMigration = true
    }
    node {
        name "O=Alice Corp,L=Madrid,C=ES"
        p2pPort 10002
        rpcSettings {
            address "localhost:10003"
            adminAddress "localhost:10103"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Bob Plc,L=Rome,C=IT"
        p2pPort 10005
        rpcSettings {
            address "localhost:10006"
            adminAddress "localhost:10007"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Notary Node,L=Zurich,C=CH"
        p2pPort 10009
        rpcSettings {
            address "localhost:10010"
            adminAddress "localhost:10110"
        }
        notary = [validating: true,
                  serviceLegalName: "O=Notary Service,L=Zurich,C=CH"
        ]
    }
}

task deployNodesCustom(type: Cordform) {
    directory file("$buildDir/nodes/nodesCustom")
    nodeDefaults {
        projectCordapp {
            deploy = false
        }
        extraConfig = [h2Settings: [address: "localhost:0"]]
        cordapp project(':samples:notary-demo:contracts')
        cordapp project(':samples:notary-demo:workflows')
    }
    node {
        name "O=Alice Corp,L=Madrid,C=ES"
        p2pPort 10002
        rpcSettings {
            address "localhost:10003"
            adminAddress "localhost:10103"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Bob Plc,L=Rome,C=IT"
        p2pPort 10005
        rpcSettings {
            address "localhost:10006"
            adminAddress "localhost:10007"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Notary Node,L=Zurich,C=CH"
        p2pPort 10009
        rpcSettings {
            address "localhost:10010"
            adminAddress "localhost:10110"
        }
        notary = [
                validating: true,
                className: "net.corda.notarydemo.MyCustomValidatingNotaryService",
                serviceLegalName: "O=Notary Service,L=Zurich,C=CH"
        ]
    }
}

task deployNodesRaft(type: Cordform) {
    directory file("$buildDir/nodes/nodesRaft")
    nodeDefaults {
        projectCordapp {
            deploy = false
        }
        extraConfig = [h2Settings: [address: "localhost:0"]]
        cordapp project(':samples:notary-demo:contracts')
        cordapp project(':samples:notary-demo:workflows')
    }
    node {
        name "O=Alice Corp,L=Madrid,C=ES"
        p2pPort 10002
        rpcSettings {
            address "localhost:10003"
            adminAddress "localhost:10103"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Bob Plc,L=Rome,C=IT"
        p2pPort 10005
        rpcSettings {
            address "localhost:10006"
            adminAddress "localhost:10007"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Notary Service 0,L=Zurich,C=CH"
        p2pPort 10009
        rpcSettings {
            address "localhost:10010"
            adminAddress "localhost:10110"
        }
        notary = [
                validating: true,
                serviceLegalName: "O=Raft,L=Zurich,C=CH",
                raft: [
                        nodeAddress: "localhost:10008"
                ]
        ]
    }
    node {
        name "O=Notary Service 1,L=Zurich,C=CH"
        p2pPort 10013
        rpcSettings {
            address "localhost:10014"
            adminAddress "localhost:10114"
        }
        notary = [
                validating: true,
                serviceLegalName: "O=Raft,L=Zurich,C=CH",
                raft: [
                        nodeAddress: "localhost:10012",
                        clusterAddresses: ["localhost:10008"]
                ]
        ]
    }
    node {
        name "O=Notary Service 2,L=Zurich,C=CH"
        p2pPort 10017
        rpcSettings {
            address "localhost:10018"
            adminAddress "localhost:10118"
        }
        notary = [
                validating: true,
                serviceLegalName: "O=Raft,L=Zurich,C=CH",
                raft: [
                        nodeAddress: "localhost:10016",
                        clusterAddresses: ["localhost:10008"]
                ]
        ]
    }
}

task deployNodesBFT(type: Cordform) {
    def clusterAddresses = ["localhost:11000", "localhost:11010", "localhost:11020", "localhost:11030"]
    directory file("$buildDir/nodes/nodesBFT")
    nodeDefaults {
        projectCordapp {
            deploy = false
        }
        extraConfig = [h2Settings: [address: "localhost:0"]]
        cordapp project(':samples:notary-demo:contracts')
        cordapp project(':samples:notary-demo:workflows')
    }
    node {
        name "O=Alice Corp,L=Madrid,C=ES"
        p2pPort 10002
        rpcSettings {
            address "localhost:10003"
            adminAddress "localhost:10103"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Bob Plc,L=Rome,C=IT"
        p2pPort 10005
        rpcSettings {
            address "localhost:10006"
            adminAddress "localhost:10007"
        }
        rpcUsers = [[user: "demou", password: "demop", permissions: ["ALL"]]]
    }
    node {
        name "O=Notary Service 0,L=Zurich,C=CH"
        p2pPort 10009
        rpcSettings {
            address "localhost:10010"
            adminAddress "localhost:10110"
        }
        notary = [
                validating: false,
                serviceLegalName: "O=BFT,L=Zurich,C=CH",
                bftSMaRt: [
                        replicaId: 0,
                        clusterAddresses: clusterAddresses
                ]
        ]
    }
    node {
        name "O=Notary Service 1,L=Zurich,C=CH"
        p2pPort 10013
        rpcSettings {
            address "localhost:10014"
            adminAddress "localhost:10114"
        }
        notary = [
                validating: false,
                serviceLegalName: "O=BFT,L=Zurich,C=CH",
                bftSMaRt: [
                        replicaId: 1,
                        clusterAddresses: clusterAddresses
                ]
        ]
    }
    node {
        name "O=Notary Service 2,L=Zurich,C=CH"
        p2pPort 10017
        rpcSettings {
            address "localhost:10018"
            adminAddress "localhost:10118"
        }
        notary = [
                validating: false,
                serviceLegalName: "O=BFT,L=Zurich,C=CH",
                bftSMaRt: [
                        replicaId: 2,
                        clusterAddresses: clusterAddresses
                ]
        ]
    }
    node {
        name "O=Notary Service 3,L=Zurich,C=CH"
        p2pPort 10021
        rpcSettings {
            address "localhost:10022"
            adminAddress "localhost:10122"
        }
        notary = [
                validating: false,
                serviceLegalName: "O=BFT,L=Zurich,C=CH",
                bftSMaRt: [
                        replicaId: 3,
                        clusterAddresses: clusterAddresses
                ]
        ]
    }
}

task notarise(type: JavaExec, dependsOn: jar) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'net.corda.notarydemo.client.NotariseKt'
}
