pipeline {
  agent {
    node {
      label 'SCALE-Build'
    }
  }
  stages {
    stage('Upload') {
      steps {
        echo '*** Grabbing artifacts from Build - TrueNAS SCALE (Full - Nightly ISO) ***'
        copyArtifacts filter: '**/*.iso', fingerprintArtifacts: true, flatten: true, projectName: 'Build - TrueNAS SCALE (Full - Nightly ISO)', selector: lastSuccessful(), target: 'upload/files'
        copyArtifacts filter: '**/*.sha256', fingerprintArtifacts: true, flatten: true, projectName: 'Build - TrueNAS SCALE (Full - Nightly ISO)', selector: lastSuccessful(), target: 'upload/files'
        sh 'ssh jenkins@staging.sys.ixsystems.net mkdir -p /zdata/download.sys.truenas.net/truenas-scale-goldeye-nightly/ || true'
        sh 'scp upload/files/TrueNAS-SCALE*.iso upload/files/TrueNAS-SCALE*.iso.sha256 jenkins@staging.sys.ixsystems.net:/zdata/download.sys.truenas.net/truenas-scale-goldeye-nightly/'
        sh 'rm -rf upload/files'
        copyArtifacts filter: '**/*.update', fingerprintArtifacts: true, flatten: true, projectName: 'Build - TrueNAS SCALE (Full - Nightly ISO)', selector: lastSuccessful(), target: 'upload/files'
        copyArtifacts filter: '**/*.json', fingerprintArtifacts: true, flatten: true, projectName: 'Build - TrueNAS SCALE (Full - Nightly ISO)', selector: lastSuccessful(), target: 'upload/files'
        sh 'ssh jenkins@staging.sys.ixsystems.net mkdir -p /zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies || true'
        sh 'scp upload/files/manifest.json upload/files/TrueNAS-SCALE-*.update jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/'
      }
    }
    stage('Update Releases JSON') {
      steps {
        script {
          // Download existing releases.json if it exists
          sh '''scp jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/releases.json upload/files/releases.json || echo "{}" > upload/files/releases.json'''
          
          // Read manifest.json and extract information
          def manifestContent = readFile('upload/files/manifest.json')
          def manifest = readJSON text: manifestContent
          
          // Read existing releases.json
          def existingReleasesContent = readFile('upload/files/releases.json')
          def existingReleases = readJSON text: existingReleasesContent
          
          // Add new release entry to existing releases dictionary
          // Copy all manifest fields and add profile
          def releaseEntry = [:]
          manifest.each { key, value ->
            releaseEntry[key] = value
          }
          releaseEntry.profile = 'DEVELOPER'
          existingReleases[manifest.version] = releaseEntry
          
          echo "Adding new build to releases.json: ${manifest.version} (date: ${manifest.date})"
          
          // Keep only the last 30 entries by date
          if (existingReleases.size() > 30) {
            // Convert map to list of entries with dates
            def entriesList = []
            existingReleases.each { version, data ->
              entriesList.add([version: version, data: data, dateStr: data.date])
            }
            
            // Manual bubble sort (Jenkins-safe, no closures or comparators)
            for (int i = 0; i < entriesList.size() - 1; i++) {
              for (int j = 0; j < entriesList.size() - i - 1; j++) {
                // Compare dates as strings (ISO 8601 format is lexicographically sortable)
                if (entriesList[j].dateStr < entriesList[j + 1].dateStr) {
                  // Swap entries
                  def temp = entriesList[j]
                  entriesList[j] = entriesList[j + 1]
                  entriesList[j + 1] = temp
                }
              }
            }
            
            // Keep only the first 30 entries
            def maxEntries = Math.min(30, entriesList.size())
            def recentEntries = entriesList[0..(maxEntries - 1)]
            
            echo "Total builds before cleanup: ${entriesList.size()}"
            echo "Keeping the ${maxEntries} most recent builds"
            
            // Log which builds are being removed
            if (entriesList.size() > 30) {
              echo "Removing ${entriesList.size() - 30} old builds:"
              for (int i = 30; i < entriesList.size(); i++) {
                echo "  - Removing: ${entriesList[i].version} (date: ${entriesList[i].dateStr})"
              }
            }
            
            // Rebuild the releases map
            existingReleases = [:]
            recentEntries.each { entry ->
              existingReleases[entry.version] = entry.data
            }
          }
          
          // Log final list of builds in releases.json
          echo "\nFinal releases.json will contain ${existingReleases.size()} builds:"
          def sortedVersions = []
          existingReleases.each { version, data ->
            sortedVersions.add([version: version, date: data.date])
          }
          // Sort for display
          for (int i = 0; i < sortedVersions.size() - 1; i++) {
            for (int j = 0; j < sortedVersions.size() - i - 1; j++) {
              if (sortedVersions[j].date < sortedVersions[j + 1].date) {
                def temp = sortedVersions[j]
                sortedVersions[j] = sortedVersions[j + 1]
                sortedVersions[j + 1] = temp
              }
            }
          }
          sortedVersions.each { build ->
            echo "  - ${build.version} (date: ${build.date})"
          }
          
          // Write updated releases.json
          writeJSON file: 'upload/files/releases.json', json: existingReleases, pretty: 4
          
          // Verify the file was written
          sh 'ls -la upload/files/releases.json'
          echo "releases.json file size: "
          sh 'wc -c upload/files/releases.json'
          
          // Show first few lines of the file for verification
          echo "First 10 lines of releases.json:"
          sh 'head -10 upload/files/releases.json'
          
          // Upload updated releases.json
          echo "Uploading releases.json to staging server..."
          sh '''scp upload/files/releases.json jenkins@staging.sys.ixsystems.net:/zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/'''
          
          // Verify upload succeeded
          echo "Verifying remote file..."
          sh '''ssh jenkins@staging.sys.ixsystems.net "ls -la /zdata/update.sys.truenas.net/scale/TrueNAS-SCALE-Goldeye-Nightlies/releases.json"'''
          
          sh 'rm -rf upload/files'
        }
      }
    }
  }
}