name: Release

on:
  push:
    branches:
      - 'release/**'

jobs:
  release:
    runs-on: docker
    
    steps:
      # Install software dependencies into the runner container
      - name: Install system dependencies
        run: |
          apt-get update
          apt-get install -y nodejs npm openjdk-17-jdk maven git
          export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
          echo "JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV

      - name: Check Java and Node versions
        run: |
          java -version
          mvn -v
          mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout
          node -v
          npm -v
          
      # Checkout (clone) a fresh repo source of the project
      - name: Checkout repository
        uses: actions/checkout@v4
      
      # ##################################################################
      # ## THIS IS A RELEASE                                            ##
      # ##    #1. Get full version string                               ##
      # ##    #2. Remove sufix "-SNAPSHOT" from version string          ##
      # ##        And commit                                            ##
      # ##    #3. Tag the release                                       ##
      # ##                                                              ##
      - name: Extract version from pom.xml
        id: version
        run: |
          VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
          RELEASE_VERSION="${VERSION/-SNAPSHOT/}"
          echo "release_version=$RELEASE_VERSION" >> $GITHUB_OUTPUT

      - name: Set release version (remove -SNAPSHOT)
        run: |
          mvn versions:set -DnewVersion=${{ steps.version.outputs.release_version }}
          mvn versions:commit
          git config user.name "forgejo-actions"
          git config user.email "ci@forgejo.local"
          git commit -am "Release ${{ steps.version.outputs.release_version }}"
          git push

      - name: Tag release
        run: |
          git tag -a v${{ steps.version.outputs.release_version }} -m "Release ${{ steps.version.outputs.release_version }}"
          git push origin v${{ steps.version.outputs.release_version }}
      # ##                                                              ##
      # ##################################################################
            
      # Install @Angular dependencies
      - name: Install frontend dependencies
        if: false # DISABLED for testing. To check if backend build is also doing frontend.
        run: |
          cd src/main/webapp
          npm ci

      # Build the frontend
      - name: Build frontend
        if: false # DISABLED for testing. To check if backend build is also doing frontend.
        run: |
          cd src/main/webapp
          npm run build
    
      # Build the backend (JAR). NOTE:  the -Dmaven.download.parallel=false will force MAVEN to have a single connection for downloads, without this I can get "Connection reset"
      - name: Build backend (Spring Boot)
        if: false # DISABLED for testing. Justo to make it faster to reach the CREATE RELEASE step
        run: |
          echo "DEBUG Outputs ************************* "
          echo "Container hostname: $(hostname)"
          echo "Runner working dir: $PWD"
          echo "Runner user: $(whoami)"
          echo "Listing contents of ~/.m2/repository:"
          ls -lhR ~/.m2/repository | head -n 100 || echo "No .m2/repository found"
          echo "Disk usage:"
          du -sh ~/.m2/repository || echo "No .m2 directory found"
          echo " "
          echo "BUILD Outputs ************************* "
          mvn clean package -Pprod -DskipTests -Dmaven.download.parallel=false -Dmaven.repo.local=/root/.m2/repository -s .forgejo/workflows/ci-settings.xml 
        container:
          image: maven:3.9-eclipse-temurin-17
          volumes:
            - docker-forgejo_maven-cache:/root/.m2
            
      # Log output
      - name: List output files
        run: |
          ls -lh target/*.jar || true
        
      # save artifacts
      - name: Upload backend JAR
        uses: actions/upload-artifact@v3
        with:
          name: app-backend
          path: target/resilient*.jar
          
      # auto-create a release
      - name: Create release and upload JAR to Forgejo
        run: |
          # Install Forgejo CLI
          echo "Downloading forgejo-linux-amd64 ..."
          wget https://codeberg.org/forgejo/forgejo-cli/releases/download/v0.7.0/forgejo-cli-linux-amd64 -O /usr/local/bin/forgejo
          echo "Downloaded forgejo-linux-amd64"
          echo "chmod +x /usr/local/bin/forgejo"
          chmod +x /usr/local/bin/forgejo

          # Verify binary
          echo "Verify binary"
          file /usr/local/bin/forgejo # Should say: ELF 64-bit ...
          
          # Configure Forgejo CLI with token
          forgejo config --host https://git.oguerreiro.com --token "${{ secrets.FORGEJO_TOKEN }}"

          # Extract version
          VERSION="${{ steps.version.outputs.release_version }}"

          # Create the release
          forgejo release create "v$VERSION" \
            --title "Release $VERSION" \
            --notes "Automated release created by CI" \
            --repo root/resilient

          # Upload the JAR artifact
          forgejo release upload "v$VERSION" target/resilient*.jar \
            --repo root/resilient

      # ##################################################################
      # ## THIS IS A RELEASE - Change master version to next SNAPSHOT   ##
      # ##    #4. Checkout master                                       ##
      # ##    #5. Calculate the new version string                      ##
      # ##        Update pom.xml                                        ##
      # ##        Calculate the new version string                      ##
      - name: Checkout main
        if: false # DISABLED for testing. DON't atually change master version
        uses: actions/checkout@v3
        with:
          ref: master

      - name: Bump to next SNAPSHOT version
        if: false # DISABLED for testing. DON't atually change master version
        run: |
          # Extract the version from the ref, handling tags like v1.0.2 or branches like release/1.0.2
          RAW_REF="${GITHUB_REF##*/}"  # gets 'v1.0.2' or '1.0.2'
          VERSION="${RAW_REF#v}"       # strips leading 'v' if present → gives '1.0.2'

          echo "Current version: $VERSION"

          MAJOR=$(echo "$VERSION" | cut -d. -f1)
          MINOR=$(echo "$VERSION" | cut -d. -f2)
          PATCH=$(echo "$VERSION" | cut -d. -f3)
          NEXT_PATCH=$((PATCH + 1))
          NEXT_VERSION="$MAJOR.$MINOR.$NEXT_PATCH-SNAPSHOT"

          echo "Next version: $NEXT_VERSION"

          mvn versions:set -DnewVersion="$NEXT_VERSION"
          mvn versions:commit

          git config user.name "forgejo-actions"
          git config user.email "ci@forgejo.local"
          git commit -am "Start next development cycle $NEXT_VERSION"
          git push origin master
      # ##                                                              ##
      # ##################################################################