// Jenkins-Pipeline für den PDF KI Renamer
// Läuft auf einem Linux-Container (Synology NAS).
// Der MSI-Build ist Windows-only (jpackage + WiX Toolset 3.x). Jenkins läuft im
// Linux-Container auf Synology NAS und kann kein MSI erzeugen. Der MSI-Build
// wird bewusst manuell auf der Windows-Entwicklungsmaschine ausgeführt:
//   .\mvnw.cmd clean package -P release -pl pdf-umbenenner-packaging --also-make -DskipTests

pipeline {
    agent any

    tools {
        maven 'maven-3'
    }

    // MAJOR und MINOR werden manuell als Jenkins-Parameter gepflegt.
    // BUILD_NUMBER wird automatisch durch Jenkins vergeben.
    // Die resultierende Versionsnummer lautet: MAJOR.MINOR.BUILD_NUMBER
    parameters {
        string(
            name: 'MAJOR',
            defaultValue: '3',
            description: 'Hauptversionsnummer (manuell pflegen)'
        )
        string(
            name: 'MINOR',
            defaultValue: '0',
            description: 'Nebenversionsnummer (manuell pflegen)'
        )
    }

    environment {
        // Effektive Versionsteile – übernommen aus Parametern oder State-Datei.
        // Hinweis: Wenn MAJOR/MINOR aus einer persistierten State-Datei gelesen
        // werden sollen (z. B. /builds/version.state), muss die Logik unten in
        // der Stage 'Version bestimmen' entsprechend ergänzt werden.
        // Im Minimalbetrieb werden die Parameter direkt übernommen.
        EFFECTIVE_MAJOR = "${params.MAJOR}"
        EFFECTIVE_MINOR = "${params.MINOR}"
    }

    stages {

        // Optionaler Stub: MAJOR/MINOR aus persistierter State-Datei laden.
        // Wenn das bestehende Jenkins-Setup die Versionsnummern in einer
        // State-Datei unter /builds/version.state persistiert, kann diese
        // Stage die Umgebungsvariablen EFFECTIVE_MAJOR und EFFECTIVE_MINOR
        // vor dem Build überschreiben. Ansonsten gelten die Parameter-Werte.
        stage('Version bestimmen') {
            steps {
                script {
                    // Platzhalter: hier bei Bedarf State-Datei einlesen,
                    // z. B.:
                    //   def state = readFile('/builds/version.state').trim()
                    //   env.EFFECTIVE_MAJOR = state.split('\\.')[0]
                    //   env.EFFECTIVE_MINOR = state.split('\\.')[1]
                    //
                    // Im Minimalbetrieb werden die Parameter-Werte verwendet:
                    echo "Buildversion: ${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER}"
                }
            }
        }

        stage('Maven Build') {
            steps {
                // -Drevision übergibt die vollständige Versionsnummer an Maven.
                // Das flatten-maven-plugin im Parent-POM löst ${revision} in
                // allen installierten POMs auf, sodass kein unaufgelöstes
                // ${revision} in ~/.m2 verbleibt.
                sh "mvn clean verify -Drevision=${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER}"
            }
        }

        stage('Archive JAR') {
            steps {
                // Bash wird explizit erzwungen (#!/usr/bin/env bash, set -euo pipefail),
                // weil Jenkins-Agenten standardmäßig sh (dash) verwenden, das kein
                // mapfile kennt. mapfile zählt exakt die gefundenen Shade-JARs und
                // bricht den Build ab, wenn nicht genau eines vorhanden ist.
                sh '''#!/usr/bin/env bash
set -euo pipefail

mapfile -t JARS < <(find pdf-umbenenner-bootstrap/target \
    -maxdepth 1 -name "pdf-umbenenner-bootstrap-*.jar" \
    ! -name "*-sources.jar" ! -name "*-javadoc.jar")

test "${#JARS[@]}" -eq 1 \
    || { echo "FEHLER: Erwartet genau 1 Shade-JAR, gefunden: ${#JARS[@]}"; exit 1; }

JAR_NAME="pdf-ki-renamer-${EFFECTIVE_MAJOR}.${EFFECTIVE_MINOR}.${BUILD_NUMBER}.jar"
cp "${JARS[0]}" "$JAR_NAME"
echo "Shade-JAR archiviert als: $JAR_NAME"
'''
                archiveArtifacts artifacts: 'pdf-ki-renamer-*.jar', fingerprint: true
            }
        }

        stage('Berichte') {
            steps {
                // JUnit-Testergebnisse einlesen
                junit testResults: '**/target/surefire-reports/*.xml', allowEmptyResults: true

                // JaCoCo-Coverage (falls im Build erzeugt)
                // jacoco execPattern: '**/target/jacoco.exec'

                // PIT-Mutationstest-Bericht (falls im Build erzeugt)
                // publishHTML(target: [reportDir: 'target/pit-reports', ...])
            }
        }

        stage('Artefakt ablegen') {
            steps {
                // JAR-Kopie in zentrales Build-Verzeichnis ablegen.
                // Pfad /builds/ muss auf dem Jenkins-Agent gemountet sein.
                sh '''#!/usr/bin/env bash
set -euo pipefail

BUILD_DIR="/builds/${EFFECTIVE_MAJOR}.${EFFECTIVE_MINOR}.${BUILD_NUMBER}"
mkdir -p "$BUILD_DIR"
cp pdf-ki-renamer-*.jar "$BUILD_DIR/"
echo "Artefakt abgelegt unter: $BUILD_DIR"
'''
            }
        }

        stage('Aufräumen') {
            steps {
                // Lokale JAR-Kopie im Workspace entfernen (Artefakt ist archiviert)
                sh '''#!/usr/bin/env bash
set -euo pipefail
rm -f pdf-ki-renamer-*.jar
echo "Aufräumen abgeschlossen."
'''
            }
        }
    }

    post {
        success {
            echo "Build ${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER} erfolgreich abgeschlossen."
        }
        failure {
            echo "Build ${env.EFFECTIVE_MAJOR}.${env.EFFECTIVE_MINOR}.${env.BUILD_NUMBER} fehlgeschlagen."
        }
        always {
            // Workspace nach Abschluss bereinigen
            deleteDir()
        }
    }
}
