pipeline {
    agent any

    tools {
        jdk "Temurin Java 21"
    }

    triggers {
        githubPush()
    }

    environment {
        DISCORD_WEBHOOK_URL = credentials('polydev-discord-webhook-url')
    }

    stages {
        stage('Checkout') {
            steps {
                scmSkip(deleteBuild: true)
            }
        }

        stage('Setup Gradle') {
            steps {
                sh 'chmod +x gradlew'
            }
        }

        stage('Build') {
            steps {
                withGradle {
                    sh './gradlew build --rerun-tasks -x check'
                    sh './gradlew javadoc'
                }
            }

            post {
                success {
                    archiveArtifacts artifacts: 'platforms/fabric/build/libs/Terra-fabric*.jar,platforms/bukkit/build/libs/Terra-bukkit*-shaded.jar,platforms/allay/build/libs/Terra-allay*.jar,platforms/minestom/build/libs/Terra-minestom*.jar', fingerprint: true, onlyIfSuccessful: true

                    javadoc javadocDir: 'common/api/build/docs/javadoc', keepAll: true
                }
            }
        }

        stage('Tests') {
            steps {
                withGradle {
                    sh './gradlew test --rerun-tasks'
                }
            }
        }

//         stage('Deploy to snapshots repositories') {
//             when {
//                 allOf {
//                     not { buildingTag() }
//                     not { expression { env.TAG_NAME != null && env.TAG_NAME.matches('v\\d+\\.\\d+\\.\\d+') } }
//                 }
//             }
//
//             steps {
//                 withCredentials([
//                     string(credentialsId: 'maven-signing-key', variable: 'ORG_GRADLE_PROJECT_signingKey'),
//                     string(credentialsId: 'maven-signing-key-password', variable: 'ORG_GRADLE_PROJECT_signingPassword'),
//                     usernamePassword(
//                         credentialsId: 'solo-studios-maven',
//                         passwordVariable: 'ORG_GRADLE_PROJECT_SoloStudiosSnapshotsPassword',
//                         usernameVariable: 'ORG_GRADLE_PROJECT_SoloStudiosSnapshotsUsername'
//                     )
//                 ]) {
//                     withGradle {
//                         sh './gradlew publishAllPublicationsToSoloStudiosSnapshotsRepository'
//                     }
//                 }
//             }
//         }

        stage('Deploy to releases repositories') {
//             when {
//                 allOf {
//                     buildingTag()
//                     expression { env.TAG_NAME != null && env.TAG_NAME.matches('v\\d+\\.\\d+\\.\\d+') }
//                 }
//             }

            steps {
                withCredentials([
                    string(credentialsId: 'maven-signing-key', variable: 'ORG_GRADLE_PROJECT_signingKey'),
                    string(credentialsId: 'maven-signing-key-password', variable: 'ORG_GRADLE_PROJECT_signingPassword'),
                    usernamePassword(
                        credentialsId: 'solo-studios-maven',
                        passwordVariable: 'ORG_GRADLE_PROJECT_SoloStudiosReleasesPassword',
                        usernameVariable: 'ORG_GRADLE_PROJECT_SoloStudiosReleasesUsername'
                    ),
                    // TODO: does not yet exist (uncomment once added)
                    // usernamePassword(
                    //     credentialsId: 'sonatype-maven-credentials',
                    //     passwordVariable: 'ORG_GRADLE_PROJECT_SonatypePassword',
                    //     usernameVariable: 'ORG_GRADLE_PROJECT_SonatypeUsername'
                    // ),
                    // usernamePassword(
                    //     credentialsId: 'codemc-maven-credentials',
                    //     passwordVariable: 'ORG_GRADLE_PROJECT_CodeMCPassword',
                    //     usernameVariable: 'ORG_GRADLE_PROJECT_CodeMCUsername'
                    // )
                ]) {
                    withGradle {
                        sh './gradlew publish'
                        //sh './gradlew publishAllPublicationsToSoloStudiosReleasesRepository'
                        // sh './gradlew publishAllPublicationsToSonatypeRepository'
                        // sh './gradlew publishAllPublicationsToCodeMCRepository'
                    }
                }
            }
        }
    }

    post {
        always {
            discoverReferenceBuild()

            // junit testResults: '**/build/test-results/*/TEST-*.xml'

            recordIssues(
                aggregatingResults: true,
                enabledForFailure: true,
                minimumSeverity: 'ERROR',
                sourceCodeEncoding: 'UTF-8',
                checksAnnotationScope: 'ALL',
                sourceCodeRetention: 'LAST_BUILD',
                tools: [java(), javaDoc()]
            )

            discordSend(
                title: env.JOB_NAME + ' ' + env.BUILD_DISPLAY_NAME,
                showChangeset: true,
                enableArtifactsList: true,
                link: env.BUILD_URL,
                result: currentBuild.currentResult,
                customAvatarUrl: 'https://github.com/PolyhedralDev.png',
                customUsername: 'Solo Studios Jenkins',
                webhookURL: env.DISCORD_WEBHOOK_URL,
            )

            cleanWs()
        }
    }
}
