name: Close Stale Issues

on:
  schedule:
    - cron: '0 0 * * *'  # Daily at midnight UTC
  workflow_dispatch:  # Manual trigger

jobs:
  stale:
    runs-on: ubuntu-latest
    env:
      API_TOKEN: ${{ secrets.BOT_ACCESS_TOKEN }}
      API_BASE_URL: https://git.psmattas.com/api/v1
      REPO: ${{ gitea.repository }}

    steps:
      - name: Mark stale issues
        run: |
          # Calculate timestamp for 30 days ago (seconds since epoch for comparison)
          THIRTY_DAYS_AGO_SEC=$(date -d '30 days ago' '+%s')

          # Get all open issues sorted by oldest update first
          ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&sort=updated&order=asc" | jq -c '.[]')

          # Safety Check 1: Exit if no issues found
          if [ -z "$ISSUES" ]; then
            echo "No open issues found."
            exit 0
          fi

          echo "$ISSUES" | while IFS= read -r issue; do
            # Safety Check 2: Skip empty lines
            if [ -z "$issue" ]; then continue; fi

            ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
            UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
            UPDATED_AT_SEC=$(date -d "$UPDATED_AT" '+%s')

            # Stop processing if we reach issues newer than 30 days
            if [ "$UPDATED_AT_SEC" -gt "$THIRTY_DAYS_AGO_SEC" ]; then
               continue
            fi

            HAS_STALE_LABEL=$(echo "$issue" | jq -r '.labels[] | select(.name == "status: stale") | .name')

            if [ -n "$HAS_STALE_LABEL" ]; then
              continue
            fi

            echo "Marking issue #$ISSUE_NUMBER as stale (last updated: $UPDATED_AT)"

            LABELS='{"labels": ["status: stale"]}'
            curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$LABELS" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels"

            STALE_MSG="This issue has been automatically marked as stale because it has not had recent activity.\n\nIt will be closed in **14 days** if no further activity occurs.\n\nIf this issue is still relevant, please:\n- Add a comment with updates\n- Remove the \`status: stale\` label\n\nThank you for your contributions! 🙏"
            COMMENT_JSON=$(jq -n --arg body "$STALE_MSG" '{"body": $body}')
            curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$COMMENT_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments"
          done

      - name: Close stale issues
        run: |
          FOURTEEN_DAYS_AGO=$(date -u -d '14 days ago' '+%Y-%m-%dT%H:%M:%SZ')

          # Get stale issues
          ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')

          # FIX: Check if list is empty
          if [ -z "$ISSUES" ]; then
            echo "No stale issues found to close."
            exit 0
          fi

          echo "$ISSUES" | while IFS= read -r issue; do
            # FIX: Check for empty line
            if [ -z "$issue" ]; then continue; fi

            ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
            UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')

            if [[ "$UPDATED_AT" < "$FOURTEEN_DAYS_AGO" ]]; then
              echo "Closing stale issue #$ISSUE_NUMBER (last updated: $UPDATED_AT)"

              CLOSE_JSON='{"state": "closed"}'
              curl -s -f -X PATCH -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$CLOSE_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER"

              CLOSE_MSG="This issue was automatically closed due to inactivity.\n\nIf you believe this was closed in error, please:\n1. Reopen the issue\n2. Provide updated information\n3. Remove the \`status: stale\` label\n\nThank you! 🙏"
              COMMENT_JSON=$(jq -n --arg body "$CLOSE_MSG" '{"body": $body}')
              curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$COMMENT_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments"
            fi
          done

      - name: Remove stale label on activity
        run: |
          ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')

          # FIX: Check if list is empty
          if [ -z "$ISSUES" ]; then
            echo "No stale issues found to check for activity."
            exit 0
          fi

          echo "$ISSUES" | while IFS= read -r issue; do
            # FIX: Check for empty line
            if [ -z "$issue" ]; then continue; fi

            ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')

            COMMENTS=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments")
            LATEST_COMMENT_AUTHOR=$(echo "$COMMENTS" | jq -r '.[-1].user.login // empty')

            # Skip if no comments exist or fetch failed
            if [ -z "$LATEST_COMMENT_AUTHOR" ]; then continue; fi

            if [ "$LATEST_COMMENT_AUTHOR" != "EC-bot" ] && [ "$LATEST_COMMENT_AUTHOR" != "gitea-actions" ]; then
              echo "Removing stale label from issue #$ISSUE_NUMBER (recent activity detected)"

              LABELS=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels")
              STALE_LABEL_ID=$(echo "$LABELS" | jq -r '.[] | select(.name == "status: stale") | .id')

              if [ -n "$STALE_LABEL_ID" ]; then
                curl -s -f -X DELETE -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels/$STALE_LABEL_ID"
              fi
            fi
          done
