def mainClassName = "pro.gravit.launchserver.LaunchServerStarter"
def mainAgentName = "pro.gravit.launchserver.StarterAgent"

evaluationDependsOn(':Launcher')

repositories {
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
    maven {
        url "https://jcenter.bintray.com/"
    }
}

sourceCompatibility = '11'
targetCompatibility = '11'

configurations {
    compileOnlyA
    bundleOnly
    bundle
    hikari
    pack
    launch4j
    bundleOnly.extendsFrom bundle
    api.extendsFrom bundle, hikari, pack, launch4j
}

jar {
    dependsOn parent.childProjects.Launcher.tasks.assemble
    from { configurations.pack.collect { it.isDirectory() ? it : zipTree(it) } }
    from(parent.childProjects.Launcher.tasks.shadowJar)
    from(parent.childProjects.Launcher.tasks.genRuntimeJS)
    manifest.attributes("Main-Class": mainClassName,
            "Premain-Class": mainAgentName,
            "Multi-Release": "true",
            "Can-Redefine-Classes": "true",
            "Can-Retransform-Classes": "true",
            "Can-Set-Native-Method-Prefix": "true"
    )
}

test {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
}

task sourcesJar(type: Jar) {
    from sourceSets.main.allJava
    archiveClassifier = 'sources'
}

task javadocJar(type: Jar) {
    from javadoc
    archiveClassifier = 'javadoc'
}

task cleanjar(type: Jar, dependsOn: jar) {
    classifier = 'clean'
    manifest.attributes("Main-Class": mainClassName,
            "Premain-Class": mainAgentName,
            "Can-Redefine-Classes": "true",
            "Can-Retransform-Classes": "true",
            "Can-Set-Native-Method-Prefix": "true"
    )
    from sourceSets.main.output
}


dependencies {
    pack project(':LauncherAPI')
    bundle group: 'org.fusesource.jansi', name: 'jansi', version: rootProject['verJansi']
    bundle group: 'org.jline', name: 'jline', version: rootProject['verJline']
    bundle group: 'org.jline', name: 'jline-reader', version: rootProject['verJline']
    bundle group: 'org.jline', name: 'jline-terminal', version: rootProject['verJline']
    bundle group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: rootProject['verBcpkix']
    bundle group: 'org.ow2.asm', name: 'asm-commons', version: rootProject['verAsm']
    bundle group: 'io.netty', name: 'netty-all', version: rootProject['verNetty']
    bundle group: 'org.slf4j', name: 'slf4j-api', version: rootProject['verSlf4j']
    bundle group: 'org.hibernate', name: 'hibernate-core', version: rootProject['verHibernate']
    bundle group: 'org.hibernate', name: 'hibernate-hikaricp', version: rootProject['verHibernate']
    bundle group: 'mysql', name: 'mysql-connector-java', version: rootProject['verMySQLConn']
    bundle group: 'org.postgresql', name: 'postgresql', version: rootProject['verPostgreSQLConn']
    bundle group: 'com.guardsquare', name: 'proguard-base', version: rootProject['verProguard']
    bundle group: 'org.apache.logging.log4j', name: 'log4j-core', version: rootProject['verLog4j']
    bundle group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: rootProject['verLog4j']
    bundle group: 'io.jsonwebtoken', name: 'jjwt-api', version: rootProject['verJwt']
    bundle group: 'io.jsonwebtoken', name: 'jjwt-impl', version: rootProject['verJwt']
    bundle group: 'io.jsonwebtoken', name: 'jjwt-gson', version: rootProject['verJwt']
    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter', version: rootProject['verJunit']

    hikari 'io.micrometer:micrometer-core:1.5.10'
    hikari('com.zaxxer:HikariCP:4.0.3') {
        exclude group: 'javassist'
        exclude group: 'io.micrometer'
        exclude group: 'org.slf4j'
    }

    launch4j('net.sf.launch4j:launch4j:' + rootProject['verLaunch4j']) {
        exclude group: 'org.apache.ant'
        exclude group: 'net.java.abeille'
        exclude group: 'foxtrot'
        exclude group: 'com.jgoodies'
        exclude group: 'org.slf4j'
    }
    launch4j('net.sf.launch4j:launch4j:' + rootProject['verLaunch4j'] + ':workdir-win32') { transitive = false }
    launch4j('net.sf.launch4j:launch4j:' + rootProject['verLaunch4j'] + ':workdir-linux64') { transitive = false }

    compileOnlyA group: 'com.google.guava', name: 'guava', version: rootProject['verGuavaC']
    // Do not update (laggy deps).
    compileOnlyA 'log4j:log4j:1.2.17'
    compileOnlyA 'org.apache.logging.log4j:log4j-core:2.11.2'
}

task hikari(type: Copy) {
    duplicatesStrategy = 'EXCLUDE'
    into "$buildDir/libs/libraries/hikaricp"
    from configurations.hikari
}

task launch4j(type: Copy) {
    duplicatesStrategy = 'EXCLUDE'
    into "$buildDir/libs/libraries/launch4j"
    from(configurations.launch4j.collect {
        it.isDirectory() ? it : ((it.getName().startsWith("launch4j") && it.getName().contains("workdir")) ? zipTree(it) : it)
    })
    includeEmptyDirs false
    eachFile { FileCopyDetails fcp ->
        if (fcp.relativePath.pathString.startsWith("launch4j-") &&
                fcp.relativePath.pathString.contains("workdir")) {
            def segments = fcp.relativePath.segments
            def pathSegments = segments[1..-1] as String[]
            fcp.relativePath = new RelativePath(!fcp.file.isDirectory(), pathSegments)
        } else if (fcp.relativePath.pathString.contains("META-INF")) fcp.exclude()
        fcp.mode = 0755
    }
}

task dumpLibs(type: Copy) {
    duplicatesStrategy = 'EXCLUDE'
    dependsOn tasks.hikari, tasks.launch4j
    into "$buildDir/libs/libraries"
    from configurations.bundleOnly
}

task dumpCompileOnlyLibs(type: Copy) {
    duplicatesStrategy = 'EXCLUDE'
    into "$buildDir/libs/launcher-libraries-compile"
    from configurations.compileOnlyA
}

task bundle(type: Zip) {
    duplicatesStrategy = 'EXCLUDE'
    dependsOn parent.childProjects.Launcher.tasks.build, tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.jar
    archiveFileName = 'LaunchServer.zip'
    destinationDirectory = file("$buildDir")
    from(tasks.dumpLibs.destinationDir) { into 'libraries' }
    from(tasks.dumpCompileOnlyLibs.destinationDir) { into 'launcher-libraries-compile' }
    from(tasks.jar)
    from(parent.childProjects.Launcher.tasks.dumpLibs) { into 'launcher-libraries' }
}

task dumpClientLibs(type: Copy) {
    dependsOn parent.childProjects.Launcher.tasks.build
    into "$buildDir/libs/launcher-libraries"
    from parent.childProjects.Launcher.tasks.dumpLibs
}

assemble.dependsOn tasks.dumpLibs, tasks.dumpCompileOnlyLibs, tasks.dumpClientLibs, tasks.bundle, tasks.cleanjar


publishing {
    publications {
        launchserverapi(MavenPublication) {
            artifactId = 'launchserver-api'
            artifact(cleanjar) {
                classifier ""
            }
            artifact sourcesJar
            artifact javadocJar
            pom {
                name = 'GravitLauncher LaunchServer API'
                description = 'GravitLauncher LaunchServer Module API'
                url = 'https://launcher.gravit.pro'
                licenses {
                    license {
                        name = 'GNU General Public License, Version 3.0'
                        url = 'https://www.gnu.org/licenses/gpl-3.0.html'
                    }
                }
                developers {
                    developer {
                        id = 'gravita'
                        name = 'Gravita'
                        email = 'gravita@gravit.pro'
                    }
                    developer {
                        id = 'zaxar163'
                        name = 'Zaxar163'
                        email = 'zahar.vcherachny@yandex.ru'
                    }
                }

                scm {
                    connection = 'scm:git:https://github.com/GravitLauncher/Launcher.git'
                    developerConnection = 'scm:git:ssh://git@github.com:GravitLauncher/Launcher.git'
                    url = 'https://launcher.gravit.pro/'
                }
            }
        }
    }
}

signing {
    sign publishing.publications.launchserverapi
}