name: Update Version File and Create Tag

on:
  push:
    branches:
      - main  # Monitor the main branch
    paths-ignore:
      - 'patterns/**'
      - '**/*.md'

permissions:
  contents: write  # Ensure the workflow has write permissions

concurrency:
  group: version-update
  cancel-in-progress: false

jobs:
  update-version:
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@main

      - name: Set up Git
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Pull latest main and tags
        run: |
          git pull --rebase origin main
          git fetch --tags

      - name: Get the latest tag
        id: get_latest_tag
        run: |
          latest_tag=$(git tag --sort=-creatordate | head -n 1)
          echo "Latest tag is: $latest_tag"
          echo "tag=$latest_tag" >> $GITHUB_ENV  # Save the latest tag to environment file

      - name: Increment patch version
        id: increment_version
        run: |
          latest_tag=${{ env.tag }}
          major=$(echo "$latest_tag" | cut -d. -f1 | sed 's/v//')
          minor=$(echo "$latest_tag" | cut -d. -f2)
          patch=$(echo "$latest_tag" | cut -d. -f3)
          new_patch=$((patch + 1))
          new_version="${major}.${minor}.${new_patch}"
          new_tag="v${new_version}"
          echo "New version is: $new_version"
          echo "new_version=$new_version" >> $GITHUB_ENV  # Save the new version to environment file
          echo "New tag is: $new_tag"
          echo "new_tag=$new_tag" >> $GITHUB_ENV  # Save the new tag to environment file

      - name: Update version.go file
        run: |
          echo "package main" > version.go
          echo "" >> version.go
          echo "var version = \"${{ env.new_tag }}\"" >> version.go

      - name: Update version.nix file
        run: |
          echo "\"${{ env.new_version }}\"" > nix/pkgs/fabric/version.nix
      
      - name: Format source code
        run: |
          nix fmt

      - name: Update gomod2nix.toml file
        run: |
          nix run .#gomod2nix -- --outdir nix/pkgs/fabric

      - name: Commit changes
        run: |
          git add version.go
          git add nix/pkgs/fabric/version.nix
          git add nix/pkgs/fabric/gomod2nix.toml
          git add .
          if ! git diff --staged --quiet; then
            git commit -m "Update version to ${{ env.new_tag }} and commit $commit_hash"
          else
            echo "No changes to commit."
          fi

      - name: Push changes
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Use GITHUB_TOKEN to authenticate the push
        run: |
          git push origin main  # Push changes to the main branch

      - name: Create a new tag
        env:
          GITHUB_TOKEN: ${{ secrets.TAG_PAT }}
        run: |
          git tag ${{ env.new_tag }}
          git push origin ${{ env.new_tag }}  # Push the new tag

      - name: Dispatch event to trigger release workflow
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Use GITHUB_TOKEN to authenticate the dispatch
        run: |
          curl -X POST \
            -H "Authorization: token $GITHUB_TOKEN" \
            -H "Accept: application/vnd.github.v3+json" \
            https://api.github.com/repos/${{ github.repository }}/dispatches \
            -d '{"event_type": "tag_created", "client_payload": {"tag": "${{ env.new_tag }}"}}'
