name: Update Quality Badges

on:
  push:
    branches:
      - main
    paths:
      - '**.py'
      - '.coveragerc'
      # The core-coverage badge reads this list; refresh when it changes.
      - 'scripts/critical-modules.txt'
  workflow_dispatch:

jobs:
  update-badges:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'

      - name: Install dev dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements-dev.txt

      - name: Run coverage and extract percentage
        id: coverage
        run: |
          python -m coverage run -m unittest discover -t . -s tests/unit > /dev/null 2>&1 || true
          PERCENT=$(python -m coverage report 2>/dev/null | grep '^TOTAL' | grep -oP '\d+(?=%)' | tail -1)
          echo "percent=$PERCENT" >> $GITHUB_OUTPUT
          echo "Coverage: $PERCENT%"

      - name: Extract core (critical-module) coverage percentage
        id: core_coverage
        run: |
          # Reuses the .coverage data from the previous step. The core list is
          # the single source of truth in scripts/critical-modules.txt; every
          # core module is unit-tested, so the unit-only run is accurate for it.
          INCLUDE=$(grep -vE '^[[:space:]]*(#|$)' scripts/critical-modules.txt | paste -sd, -)
          PERCENT=$(python -m coverage report --include="$INCLUDE" 2>/dev/null | grep '^TOTAL' | grep -oP '\d+(?=%)' | tail -1)
          echo "percent=$PERCENT" >> $GITHUB_OUTPUT
          echo "Core coverage: $PERCENT%"

      - name: Update badges in README
        run: |
          COVERAGE_PERCENT="${{ steps.coverage.outputs.percent }}"
          CORE_COVERAGE_PERCENT="${{ steps.core_coverage.outputs.percent }}"

          if [ -n "$COVERAGE_PERCENT" ]; then
            sed -i "s|/badge/coverage-[^)]*|/badge/coverage-${COVERAGE_PERCENT}%25-brightgreen|" README.md
          fi
          if [ -n "$CORE_COVERAGE_PERCENT" ]; then
            sed -i "s|/badge/core%20coverage-[^)]*|/badge/core%20coverage-${CORE_COVERAGE_PERCENT}%25-brightgreen|" README.md
          fi

          echo "Updated badges:"
          grep -E "coverage" README.md | head -2

      - name: Commit and push badge updates
        run: |
          git config --local user.email "action@gitea.local"
          git config --local user.name "Quality Badge Bot"

          # Check if there are changes
          if git diff --quiet README.md; then
            echo "No badge changes needed"
          else
            echo "Badge changes detected, committing..."
            git add README.md
            MSG="chore: update quality badges"$'\n\n'"- Coverage: ${{ steps.coverage.outputs.percent }}%"$'\n'"- Core coverage: ${{ steps.core_coverage.outputs.percent }}%"$'\n\n'"[skip ci]"
            git commit -m "$MSG"
            git push
          fi
