name: Mark stable commit

on:
  push:
    branches:
      - main          # still run tests for main
    tags:
      - 'v*'          # run tests for version tags (e.g. v0.9.1)

jobs:
  test-unit:
    uses: ./.github/workflows/test-unit.yml

  test-integration:
    uses: ./.github/workflows/test-integration.yml

  test-env-virtual:
    uses: ./.github/workflows/test-env-virtual.yml

  test-env-nix:
    uses: ./.github/workflows/test-env-nix.yml

  test-e2e:
    uses: ./.github/workflows/test-e2e.yml

  test-virgin-user:
    uses: ./.github/workflows/test-virgin-user.yml

  test-virgin-root:
    uses: ./.github/workflows/test-virgin-root.yml

  lint-shell:
    uses: ./.github/workflows/lint-shell.yml

  lint-python:
    uses: ./.github/workflows/lint-python.yml

  mark-stable:
    needs:
      - lint-shell
      - lint-python
      - test-unit
      - test-integration
      - test-env-nix
      - test-env-virtual
      - test-e2e
      - test-virgin-user
      - test-virgin-root
    runs-on: ubuntu-latest

    # Only run this job if the push is for a version tag (v*)
    if: startsWith(github.ref, 'refs/tags/v')

    permissions:
      contents: write  # Required to move/update the tag

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          fetch-tags: true  # We need all tags for version comparison

      - name: Move 'stable' tag only if this version is the highest
        run: |
          set -euo pipefail

          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

          echo "Ref: $GITHUB_REF"
          echo "SHA: $GITHUB_SHA"

          VERSION="${GITHUB_REF#refs/tags/}"
          echo "Current version tag: ${VERSION}"

          echo "Collecting all version tags..."
          ALL_V_TAGS="$(git tag --list 'v*' || true)"

          if [[ -z "${ALL_V_TAGS}" ]]; then
            echo "No version tags found. Skipping stable update."
            exit 0
          fi

          echo "All version tags:"
          echo "${ALL_V_TAGS}"

          # Determine highest version using natural version sorting
          LATEST_TAG="$(printf '%s\n' ${ALL_V_TAGS} | sort -V | tail -n1)"

          echo "Highest version tag: ${LATEST_TAG}"

          if [[ "${VERSION}" != "${LATEST_TAG}" ]]; then
            echo "Current version ${VERSION} is NOT the highest version."
            echo "Stable tag will NOT be updated."
            exit 0
          fi

          echo "Current version ${VERSION} IS the highest version."
          echo "Updating 'stable' tag..."

          # Delete existing stable tag (local + remote)
          git tag -d stable 2>/dev/null || true
          git push origin :refs/tags/stable || true

          # Create new stable tag
          git tag stable "$GITHUB_SHA"
          git push origin stable

          echo "✅ Stable tag updated to ${VERSION}."
