name: Pyrefly Diff Check

on:
  pull_request:
    paths:
      - 'api/**/*.py'

permissions:
  contents: read

jobs:
  pyrefly-diff:
    runs-on: depot-ubuntu-24.04
    permissions:
      contents: read
      issues: write
      pull-requests: write
    steps:
      - name: Checkout PR branch
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0

      - name: Setup Python & UV
        uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
        with:
          enable-cache: true

      - name: Install dependencies
        run: uv sync --project api --dev

      - name: Prepare diagnostics extractor
        run: |
          git show ${{ github.event.pull_request.head.sha }}:api/libs/pyrefly_diagnostics.py > /tmp/pyrefly_diagnostics.py

      - name: Run pyrefly on PR branch
        run: |
          uv run --directory api --dev pyrefly check 2>&1 \
            | uv run --directory api python /tmp/pyrefly_diagnostics.py > /tmp/pyrefly_pr.txt || true

      - name: Checkout base branch
        run: git checkout ${{ github.base_ref }}

      - name: Run pyrefly on base branch
        run: |
          uv run --directory api --dev pyrefly check 2>&1 \
            | uv run --directory api python /tmp/pyrefly_diagnostics.py > /tmp/pyrefly_base.txt || true

      - name: Compute diff
        run: |
          diff -u /tmp/pyrefly_base.txt /tmp/pyrefly_pr.txt > pyrefly_diff.txt || true

      - name: Check if line counts match
        id: line_count_check
        run: |
          base_lines=$(wc -l < /tmp/pyrefly_base.txt)
          pr_lines=$(wc -l < /tmp/pyrefly_pr.txt)
          if [ "$base_lines" -eq "$pr_lines" ]; then
            echo "same=true" >> $GITHUB_OUTPUT
          else
            echo "same=false" >> $GITHUB_OUTPUT
          fi

      - name: Save PR number
        run: |
          echo ${{ github.event.pull_request.number }} > pr_number.txt

      - name: Upload pyrefly diff
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: pyrefly_diff
          path: |
            pyrefly_diff.txt
            pr_number.txt

      - name: Comment PR with pyrefly diff
        if: ${{ github.event.pull_request.head.repo.full_name == github.repository && steps.line_count_check.outputs.same == 'false' }}
        uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const fs = require('fs');
            let diff = fs.readFileSync('pyrefly_diff.txt', { encoding: 'utf8' });
            const prNumber = context.payload.pull_request.number;

            const MAX_CHARS = 65000;
            if (diff.length > MAX_CHARS) {
              diff = diff.slice(0, MAX_CHARS);
              diff = diff.slice(0, diff.lastIndexOf('\n'));
              diff += '\n\n... (truncated) ...';
            }

            const body = diff.trim()
              ? [
                  '### Pyrefly Diff',
                  '<details>',
                  '<summary>base → PR</summary>',
                  '',
                  '```diff',
                  diff,
                  '```',
                  '</details>',
                ].join('\n')
              : '### Pyrefly Diff\nNo changes detected.';

            const marker = '### Pyrefly Diff';
            const { data: comments } = await github.rest.issues.listComments({
              issue_number: prNumber,
              owner: context.repo.owner,
              repo: context.repo.repo,
            });
            const existing = comments.find((comment) => comment.body.startsWith(marker));

            if (existing) {
              await github.rest.issues.updateComment({
                comment_id: existing.id,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body,
              });
            } else {
              await github.rest.issues.createComment({
                issue_number: prNumber,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body,
              });
            }
