name: PR Approval & Validation

on:
  pull_request:
    types: [opened, submitted, edited, review_requested, review_request_removed, reopened, assigned, unassigned, ready_for_review]
  pull_request_review:
    types: [ opened, submitted, edited, review_requested, review_request_removed, reopened, assigned, unassigned, ready_for_review ]

jobs:
  assign-reviewers:
    runs-on: ubuntu-latest
    steps:
      - name: Assign Code Owners Automatically
        uses: necojackarc/auto-request-review@v0.9.0
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          config: .github/reviewers.yml

  validate-pr:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
      contents: read
    steps:
      - name: Authenticate GitHub CLI
        run: gh auth status
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Get PR Details
        run: |
          PR_BODY=$(gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json body -q ".body")
          PRIMARY=$(echo "$PR_BODY" | grep -oP '(?<=\*\*Primary Reviewer:\*\* @)\S+')
          CODEOWNER=$(echo "$PR_BODY" | grep -oP '(?<=\*\*Code Owner:\*\* @)\S+')

          echo "Primary Reviewer: $PRIMARY"
          echo "Code Owner: $CODEOWNER"

          echo "PRIMARY=$PRIMARY" >> $GITHUB_ENV
          echo "CODEOWNER=$CODEOWNER" >> $GITHUB_ENV
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Debug PR Reviews
        run: gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json reviews
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Check Approvals
        run: |
          echo "ℹ️ Primary Reviewer: $PRIMARY"
          echo "ℹ️ Code Owner: $CODEOWNER"
          
          # Get all users who approved the PR
          APPROVED_LIST=$(gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json reviews -q '
            [.reviews[] | select(.state=="APPROVED") | .author.login] | unique')
          
          echo "✅ Approved by: $APPROVED_LIST"
          
          if [[ -z "$PRIMARY" || -z "$CODEOWNER" ]]; then
            echo "❌ ERROR: PRIMARY or CODEOWNER variable is empty!"
            exit 1
          fi
          
          if [[ -z "$APPROVED_LIST" || "$APPROVED_LIST" == "[]" ]]; then
            echo "❌ ERROR: No valid approvals found!"
            exit 1
          fi
          
          # Check if Primary Reviewer is in the list
          if ! echo "$APPROVED_LIST" | grep -q "$PRIMARY"; then
            echo "❌ ERROR: Primary Reviewer ($PRIMARY) has not approved!"
            exit 1
          fi
          
          # Check if Code Owner is in the list
          if ! echo "$APPROVED_LIST" | grep -q "$CODEOWNER"; then
            echo "❌ ERROR: Code Owner ($CODEOWNER) has not approved!"
            exit 1
          fi
          
          echo "✅ Both Primary Reviewer and Code Owner have approved!"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Validate PR Checklist
        run: |
          PR_BODY=$(gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json body -q ".body")

          REQUIRED_CHECKBOXES=("Tests added" "Documentation updated" "Linting passed" "Prettier formatting")
          MISSING_CHECKS=0

          for CHECK in "${REQUIRED_CHECKBOXES[@]}"; do
            if ! echo "$PR_BODY" | grep -q "\- \[x\] $CHECK"; then
              echo "❌ ERROR: '$CHECK' is not checked in the PR checklist!"
              MISSING_CHECKS=$((MISSING_CHECKS + 1))
            fi
          done

          if [ "$MISSING_CHECKS" -gt 0 ]; then
            echo "❌ PR checklist validation failed."
            exit 1
          else
            echo "✅ All required checklist items are checked!"
          fi
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
