plugins {
    id 'application'
    id "org.moditect.gradleplugin" version "1.0.0-rc3"
}

repositories {
    mavenCentral()
}

def appVersion = rootProject.versionString

configurations {
    dep
}

apply from: "$rootDir/gradle/gradle_scripts/java.gradle"
apply from: "$rootDir/gradle/gradle_scripts/javafx.gradle"
apply from: "$projectDir/gradle_scripts/richtextfx.gradle"
apply from: "$rootDir/gradle/gradle_scripts/commons.gradle"
apply from: "$rootDir/gradle/gradle_scripts/prettytime.gradle"
apply from: "$projectDir/gradle_scripts/sentry.gradle"
apply from: "$projectDir/gradle_scripts/fxtrayicon.gradle"
apply from: "$rootDir/gradle/gradle_scripts/lombok.gradle"
apply from: "$projectDir/gradle_scripts/github-api.gradle"
apply from: "$projectDir/gradle_scripts/flexmark.gradle"
apply from: "$rootDir/gradle/gradle_scripts/picocli.gradle"
apply from: "$rootDir/gradle/gradle_scripts/versioncompare.gradle"

configurations {
    implementation.extendsFrom(dep)
}

dependencies {
    compileOnly project(':api')
    implementation project(':core')
    implementation project(':beacon')

    compileOnly 'org.hamcrest:hamcrest:2.2'
    compileOnly 'org.junit.jupiter:junit-jupiter-api:5.9.3'
    compileOnly 'org.junit.jupiter:junit-jupiter-params:5.9.3'

    implementation 'net.java.dev.jna:jna-jpms:5.13.0'
    implementation 'net.java.dev.jna:jna-platform-jpms:5.13.0'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "2.15.2"
    implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-parameter-names', version: "2.15.2"
    implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: "2.15.2"
    implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jdk8', version: "2.15.2"
    implementation group: 'org.kordamp.ikonli', name: 'ikonli-material2-pack', version: "12.2.0"
    implementation group: 'org.kordamp.ikonli', name: 'ikonli-materialdesign2-pack', version: "12.2.0"
    implementation group: 'org.kordamp.ikonli', name: 'ikonli-javafx', version: "12.2.0"
    implementation group: 'org.kordamp.ikonli', name: 'ikonli-material-pack', version: "12.2.0"
    implementation group: 'org.kordamp.ikonli', name: 'ikonli-feather-pack', version: "12.2.0"
    implementation (name: 'preferencesfx-core-11.15.0')
    implementation (group: 'com.dlsc.formsfx', name: 'formsfx-core', version: '11.6.0') {
        exclude group: 'org.openjfx', module: 'javafx-controls'
        exclude group: 'org.openjfx', module: 'javafx-fxml'
    }
    implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.7'
    implementation 'io.xpipe:modulefs:0.1.4'
    implementation 'com.jfoenix:jfoenix:9.0.10'
    implementation 'org.controlsfx:controlsfx:11.1.2'
    implementation 'net.synedra:validatorfx:0.3.1'
    implementation ('io.github.mkpaz:atlantafx-base:2.0.1') {
        exclude group: 'org.openjfx', module: 'javafx-base'
        exclude group: 'org.openjfx', module: 'javafx-controls'
    }
    implementation name: 'jSystemThemeDetector-3.8'
    implementation group: 'com.github.oshi', name: 'oshi-core-java11', version: '6.4.2'
    implementation 'org.jetbrains:annotations:24.0.1'
    implementation ('de.jangassen:jfa:1.2.0') {
        exclude group: 'net.java.dev.jna', module: 'jna'
    }
}

apply from: "$rootDir/gradle/gradle_scripts/junit.gradle"

sourceSets {
    main {
        output.resourcesDir("$buildDir/classes/java/main")
    }
}

dependencies {
    testImplementation project(':api')
    testImplementation project(':core')
}

project.allExtensions.forEach(p -> {
    dependencies {
        testCompileOnly p
    }
})


List<String> jvmRunArgs = [
        "--add-exports", "javafx.graphics/com.sun.javafx.scene=com.jfoenix",
        "--add-exports", "javafx.graphics/com.sun.javafx.stage=com.jfoenix",
        "--add-exports", "javafx.base/com.sun.javafx.binding=com.jfoenix",
        "--add-exports", "javafx.base/com.sun.javafx.event=com.jfoenix",
        "--add-exports", "javafx.controls/com.sun.javafx.scene.control=com.jfoenix",
        "--add-exports", "javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix",
        "--add-exports", "javafx.graphics/com.sun.javafx.scene.traversal=org.controlsfx.controls",
        "--add-exports", "javafx.graphics/com.sun.javafx.scene=org.controlsfx.controls",
        "--add-exports", "org.apache.commons.lang3/org.apache.commons.lang3.math=io.xpipe.app",
        "--add-opens", "java.base/java.lang.reflect=com.jfoenix",
        "--add-opens", "java.base/java.lang.reflect=com.jfoenix",
        "--add-opens", "java.base/java.lang=io.xpipe.core",
        "--add-opens", "com.dustinredmond.fxtrayicon/com.dustinredmond.fxtrayicon=io.xpipe.app",
        "--add-opens", "net.synedra.validatorfx/net.synedra.validatorfx=io.xpipe.app",
        "--add-opens", 'com.dlsc.preferencesfx/com.dlsc.preferencesfx.view=io.xpipe.app',
        "--add-opens", 'com.dlsc.preferencesfx/com.dlsc.preferencesfx.model=io.xpipe.app',
        "-Xmx8g",
        "-Dio.xpipe.app.arch=$rootProject.arch",
        "--enable-preview",
        //  "-XX:+ExitOnOutOfMemoryError",
        "-Dfile.encoding=UTF-8",
        "-Dvisualvm.display.name=XPipe"
]


test {
    jvmArgs += jvmRunArgs
    systemProperty 'io.xpipe.app.mode', 'background'
    systemProperty 'io.xpipe.app.dataDir', "$projectDir/local_test/"
    systemProperty 'io.xpipe.app.writeLogs', "false"
    systemProperty 'io.xpipe.app.writeSysOut', "true"
    systemProperty 'io.xpipe.app.developerMode', "true"
    systemProperty 'io.xpipe.app.logLevel', "trace"
    systemProperty 'io.xpipe.app.fullVersion', rootProject.fullVersion
    //systemProperty "io.xpipe.beacon.port", "21722"
}


def extensionJarDepList = project.allExtensions.stream().map(p -> p.getTasksByName('jar', true)).toList();

jar {
    finalizedBy(extensionJarDepList)
}

application {
    mainModule = 'io.xpipe.app'
    mainClass = 'io.xpipe.app.Main'
    applicationDefaultJvmArgs = jvmRunArgs
}

run {
    systemProperty 'io.xpipe.app.mode', 'gui'
    systemProperty 'io.xpipe.app.dataDir', "$projectDir/local7/"
    systemProperty 'io.xpipe.app.writeLogs', "true"
    systemProperty 'io.xpipe.app.writeSysOut', "true"
    systemProperty 'io.xpipe.app.developerMode', "true"
    systemProperty 'io.xpipe.app.logLevel', "trace"
    systemProperty 'io.xpipe.app.fullVersion', rootProject.fullVersion
    systemProperty 'io.xpipe.app.showcase', 'false'
    // systemProperty "io.xpipe.beacon.port", "21724"
    // systemProperty "io.xpipe.beacon.printMessages", "true"
    // systemProperty 'io.xpipe.app.debugPlatform', "true"

    // systemProperty "io.xpipe.beacon.localProxy", "true"

    systemProperties System.getProperties()
    systemProperty 'java.library.path', "./lib"
}

task runAttachedDebugger(type: JavaExec) {
    classpath = run.classpath
    mainModule = 'io.xpipe.app'
    mainClass = 'io.xpipe.app.Main'
    modularity.inferModulePath = true
    jvmArgs += jvmRunArgs
    jvmArgs += List.of(
            "-javaagent:${System.getProperty("user.home")}/.attachme/attachme-agent-1.2.1.jar=port:7857,host:localhost",
            "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
    )
    systemProperties run.systemProperties
}

task writeLicenses(type: DefaultTask) {
    doLast {
        def resourcesDir = new File(sourceSets.main.output.resourcesDir, "io/xpipe/app/resources/third-party")
        resourcesDir.mkdirs()
        copy {
            from "$rootDir/dist/licenses"
            into resourcesDir
        }
    }
}
processResources.finalizedBy(writeLicenses)

distTar {
    enabled = false;
}

distZip {
    enabled = false;
}
