buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath group: 'com.diluv.schoomp', name: 'Schoomp', version: '1.2.6'
    }
}

//import com.diluv.schoomp.Webhook
//import com.diluv.schoomp.message.Message

plugins {
    id 'java'
    id "org.jetbrains.kotlin.jvm"
    id 'idea'
}

def isRelease() {
    try {
        def stdout = new ByteArrayOutputStream()
        def gitHash = System.getenv('GIT_COMMIT')
        def gitPrevHash = System.getenv('GIT_PREVIOUS_COMMIT')
        def travisRange = System.getenv('TRAVIS_COMMIT_RANGE')
        if (gitHash && gitPrevHash) {
            exec {
                commandLine 'git', 'log', '--pretty=tformat:- %s', '' + gitPrevHash + '...' + gitHash
                standardOutput = stdout
            }
            return stdout.toString().toLowerCase().contains("[release")
        } else if (travisRange) {
            exec {
                commandLine 'git', 'log', '--pretty=tformat:- %s', '' + travisRange
                standardOutput = stdout
            }
            return stdout.toString().toLowerCase().contains("[release")
        } else {
            return false
        }
    } catch (ignored) {
        return false
    }
}

String getArtifactID(String platform) {
    return "${modID}-${platform}-${minecraftVersion}"
}

void setupJar(Object project) {
    project.jar {
        manifest {
            attributes([
                    'Specification-Title'     : modID,
                    'Specification-Vendor'    : "talia",
                    'Specification-Version'   : project.jar.archiveVersion,
                    'Implementation-Title'    : project.name,
                    'Implementation-Version'  : project.jar.archiveVersion,
                    'Implementation-Vendor'   : "talia",
                    'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
                    'Timestampe'              : System.currentTimeMillis(),
                    'Built-On-Java'           : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})",
                    'Build-On-Minecraft'      : minecraftVersion
            ])
        }
    }

    project.publishing {
        publications {
            mavenJava(MavenPublication) {
                groupId project.group
                artifactId project.archivesBaseName
                version project.version
                from project.components.java
            }
        }

        repositories {
            maven {
                url "file://" + System.getenv("local_maven")
            }
        }
    }
}

repositories {
    mavenCentral()
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'kotlin'
    apply plugin: 'maven-publish'

    group = "ram.talia.$modID" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
    version = "${modVersion}"
    if (!isRelease() && System.getenv('BUILD_NUMBER') != null) {
        version += "-pre-" + System.getenv('BUILD_NUMBER')
    } else if (System.getenv('TAG_NAME') != null) {
        version = System.getenv('TAG_NAME').substring(1)
        println 'Version overridden to tag version ' + version
    }
    // archivesBaseName set in each gradle

    repositories {
        maven { url "https://libraries.minecraft.net/" }

        mavenCentral()

        maven {
            name = 'Sponge / Mixin'
            url = 'https://repo.spongepowered.org/repository/maven-public/'
        }

        maven {
            name = 'BlameJared Maven'
            url = 'https://maven.blamejared.com'
        }

        maven {
            name = "Modrinth"
            url = "https://api.modrinth.com/maven"
            content {
                includeGroup "maven.modrinth"
            }
        }

        maven {
            url = "https://jitpack.io"
        }
    }


    tasks.withType(JavaCompile).configureEach {
        it.options.encoding = 'UTF-8'
        it.options.release = 17
    }

    // Disables Gradle's custom module metadata from being published to maven. The
    // metadata includes mapped dependencies which are not reasonably consumable by
    // other mod developers.
    tasks.withType(GenerateModuleMetadata) {
        enabled = false
    }

    sourceSets.main.kotlin.srcDirs += 'src/main/java'

    java.toolchain.languageVersion = JavaLanguageVersion.of(17)
    java.withSourcesJar()
    java.withJavadocJar()

    processResources {
        exclude '.cache'
    }
    processTestResources {
        exclude '.cache'
    }
    sourcesJar {
        duplicatesStrategy 'exclude'
    }
}

allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xmaxerrs" << "1000" } } }

compileKotlin {
    kotlinOptions {
        jvmTarget = "17"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "17"
    }
}

private void createReleaseTag() {
    def tagName = "$modVersion"
    ("git tag $tagName").execute()
    ("git push --tags").execute()
}

/**
 * To setup automatic modrinth exporting, get your API key from the modrinth website and place it in a
 * file in the root project directory called keys.properties
 * e.g.
 * MODRINTH_TOKEN=exampletoken
 * Then, uncomment the modrinth blocks in every build.gradle. When you run the modrinth build task
 * in the base project task space, it will upload both Forge and Fabric versions of the mod to
 * modrinth automatically, with the changelog from the changelog.md file in the base project directory.
 */
task modrinth {
    dependsOn ":Fabric:modrinth"
    dependsOn ":Forge:modrinth"
    createReleaseTag()
}

def getGitChangelog = { ->
    try {
        def stdout = new ByteArrayOutputStream()
        def gitHash = System.getenv('GIT_COMMIT')
        def gitPrevHash = System.getenv('GIT_PREVIOUS_COMMIT')
        def travisRange = System.getenv('TRAVIS_COMMIT_RANGE')
        if (gitHash && gitPrevHash) {
            exec {
                commandLine 'git', 'log', '--pretty=tformat:> - %s', '' + gitPrevHash + '...' + gitHash
                standardOutput = stdout
            }
            return stdout.toString().trim()
        } else if (travisRange) {
            exec {
                commandLine 'git', 'log', '--pretty=tformat:> - %s', '' + travisRange
                standardOutput = stdout
            }
            return stdout.toString().trim()
        } else {
            return ""
        }
    } catch (ignored) {
        return ""
    }
}

//task sendWebhook {
//    doLast {
//        try {
//            if (System.getenv('discordWebhook') == null || System.getenv("BUILD_URL") == null) {
//                println "Cannot send the webhook without the webhook url or the build url"
//                return
//            }
//            def webhook = new Webhook(System.getenv('discordWebhook'), 'Petrak@ Patreon Gradle')
//
//            def message = new Message()
//            message.setUsername("Patreon Early Access")
//            message.setContent("New **$modName** release! Download it here: ${System.getenv("BUILD_URL")}\nChangelog:\n${getGitChangelog()}")
//
//            webhook.sendMessage(message)
//        } catch (ignored) {
//            project.logger.error("Failed to push Discord webhook.")
//        }
//    }
//}
