name: Update WhatsApp Version

on:
  schedule:
    # Run daily at 06:00 UTC (when WhatsApp typically deploys updates)
    - cron: '0 6 * * *'
  workflow_dispatch:
    inputs:
      force:
        description: 'Force create PR even if version unchanged (useful for re-triggering)'
        required: false
        default: 'false'
        type: boolean

permissions:
  contents: write
  pull-requests: write
  # Note: Auto-merge may require additional permissions depending on repository settings.
  # If auto-merge fails, consider using a Personal Access Token (PAT) or GitHub App token
  # with 'pull-requests: write' and 'contents: write' scopes.

jobs:
  update-version:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node and Corepack
        uses: actions/setup-node@v4
        with:
          node-version: 20.x

      - name: Enable Corepack and Set Yarn Version
        run: |
          corepack enable
          corepack prepare yarn@4.x --activate

      - name: Configure Git for HTTPS
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # Force git to use HTTPS instead of SSH for GitHub repositories
          # IMPORTANT: Order matters! More specific rules first, then general ones
          git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
          git config --global url."https://github.com/".insteadOf "git@github.com:"

          # Configure authentication (last so it doesn't interfere with SSH -> HTTPS conversion)
          git config --global url."https://x-access-token:${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"

          # Verify git config applied correctly
          echo "✅ Git URL rewrites configured for HTTPS"
          git config --global --get-regexp url

      - name: Restore Yarn Cache
        uses: actions/cache@v4
        id: yarn-cache
        with:
          path: |
            node_modules
            .yarn/cache
            .yarn/install-state.gz
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Install packages
        run: yarn install --immutable

      - name: Update WhatsApp Web Version
        id: update_version
        run: |
          # Run the update script, capture exit code
          # Exit codes: 0=success, 1=error, 2=fetch failed (fallback used)
          set +e
          yarn update:version
          EXIT_CODE=$?
          set -e

          echo "exit_code=$EXIT_CODE" >> $GITHUB_OUTPUT

          # Only fail on fatal errors (exit code 1)
          if [ $EXIT_CODE -eq 1 ]; then
            echo "::error::Script failed with fatal error"
            exit 1
          fi

          # Exit code 2 means fetch failed but fallback was used - this is a warning
          if [ $EXIT_CODE -eq 2 ]; then
            echo "::warning::Could not fetch latest version from WhatsApp servers"
          fi

      - name: Check for changes
        id: check_changes
        run: |
          FORCE="${{ inputs.force }}"

          if git diff --quiet; then
            echo "has_changes=false" >> $GITHUB_OUTPUT
            if [ "$FORCE" == "true" ]; then
              echo "force_mode=true" >> $GITHUB_OUTPUT
              echo "::notice::Force mode enabled - will create PR even without changes"
            else
              echo "force_mode=false" >> $GITHUB_OUTPUT
            fi
          else
            echo "has_changes=true" >> $GITHUB_OUTPUT
            echo "force_mode=false" >> $GITHUB_OUTPUT
          fi

      - name: Create Pull Request
        id: create_pr
        if: steps.check_changes.outputs.has_changes == 'true' || steps.check_changes.outputs.force_mode == 'true'
        env:
          GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
        run: |
          BRANCH_NAME="update-version/stable"
          FORCE="${{ inputs.force }}"

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

          # Check if branch exists and delete it
          git push origin --delete "$BRANCH_NAME" 2>/dev/null || true

          # Create new branch
          git checkout -b "$BRANCH_NAME"

          # Only add the single source of truth file
          git add src/Defaults/baileys-version.json

          # Create commit (allow empty if force mode)
          if [ "$FORCE" == "true" ] && git diff --cached --quiet; then
            git commit --allow-empty -m "chore: force WhatsApp Web version check"
          else
            git commit -m "chore: update WhatsApp Web version"
          fi

          git push origin "$BRANCH_NAME"

          # Create PR using GitHub CLI
          PR_BODY="Automated WhatsApp Web version update.

          This PR updates the WhatsApp Web client revision to the latest version fetched from \`web.whatsapp.com\`.

          **Single source of truth:**
          - \`src/Defaults/baileys-version.json\` (other files import from here)

          **Update frequency:** Daily at 06:00 UTC"

          if [ "$FORCE" == "true" ]; then
            PR_BODY="$PR_BODY

          > **Note:** This PR was created with force mode enabled."
          fi

          # Create PR (compatible with older gh CLI versions)
          set +e
          PR_URL=$(gh pr create \
            --title "chore: update WhatsApp Web version" \
            --body "$PR_BODY" \
            --base master \
            --head "$BRANCH_NAME" 2>&1)
          PR_CREATE_EXIT=$?
          set -e

          if [ $PR_CREATE_EXIT -eq 0 ]; then
            echo "✅ PR created successfully: $PR_URL"

            # Extract PR number from URL
            PR_NUMBER=$(echo "$PR_URL" | grep -oP '\d+$')
            echo "📋 PR Number: #$PR_NUMBER"

            # Save PR number for next step
            echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
          else
            # PR creation failed - could be duplicate or other error
            echo "⚠️ Could not create PR. Checking if PR already exists..."

            # Check for existing PR (without --json for compatibility)
            EXISTING_PR=$(gh pr list --head "$BRANCH_NAME" --state open 2>/dev/null | head -1)

            if [ -n "$EXISTING_PR" ]; then
              echo "ℹ️ PR already exists for branch $BRANCH_NAME"
              echo "$EXISTING_PR"

              # Extract PR number from existing PR
              PR_NUMBER=$(echo "$EXISTING_PR" | grep -oP '^\d+')
              if [ -n "$PR_NUMBER" ]; then
                echo "📋 Existing PR Number: #$PR_NUMBER"
                # Save PR number for auto-merge step
                echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
              fi
            else
              echo "❌ PR creation failed with error:"
              echo "$PR_URL"
            fi
          fi

      - name: Enable Auto-merge
        id: enable_automerge
        if: steps.create_pr.outputs.pr_number != ''
        uses: peter-evans/enable-pull-request-automerge@v3
        with:
          token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
          pull-request-number: ${{ steps.create_pr.outputs.pr_number }}
          merge-method: squash

      - name: Summary
        run: |
          echo "### WhatsApp Version Update" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY

          EXIT_CODE="${{ steps.update_version.outputs.exit_code }}"
          HAS_CHANGES="${{ steps.check_changes.outputs.has_changes }}"
          FORCE_MODE="${{ steps.check_changes.outputs.force_mode }}"

          if [ "$EXIT_CODE" == "2" ]; then
            echo "⚠️ Warning: Could not fetch latest version from WhatsApp servers" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
          fi

          if [ "$HAS_CHANGES" == "true" ]; then
            echo "✅ New version detected and PR created" >> $GITHUB_STEP_SUMMARY
          elif [ "$FORCE_MODE" == "true" ]; then
            echo "🔄 Force mode: PR created (no version change)" >> $GITHUB_STEP_SUMMARY
          else
            echo "ℹ️ Already up to date" >> $GITHUB_STEP_SUMMARY
          fi
