# This workflow performs scheduled maintenance tasks.
#
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: BSD-2-Clause-Patent
#

name: Scheduled Maintenance

on:
  schedule:
    # * is a special character in YAML so you have to quote this string
    # Run every hour - https://crontab.guru/#0_*_*_*_*
    - cron:  '0 * * * *'
  workflow_dispatch:

jobs:
  repo_cleanup:
    runs-on: ubuntu-latest

    permissions:
      pull-requests: write
      issues: write

    steps:
      - name: Prune Won't Fix Pull Requests
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gh api \
            -H "Accept: application/vnd.github+json" \
            /repos/${GITHUB_REPOSITORY}/pulls | jq -r '.[]' | jq -rc '.html_url,.labels' | \
          while read -r html_url ; do
            read -r labels
            if [[ $labels == *"state:wont-fix"* ]]; then
              gh pr close $html_url -c "Closed due to being marked as wont fix" --delete-branch
            fi
          done

      - name: Prune Won't Fix Issues
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          REPOSITORY: ${{ env.REPOSITORY_NAME }}
        run: |
          gh api \
            -H "Accept: application/vnd.github+json" \
            /repos/${GITHUB_REPOSITORY}/issues | jq -r '.[]' | jq -rc '.html_url,.labels' | \
          while read -r html_url ; do
            read -r labels
            if [[ $labels == *"state:wont-fix"* ]]; then
              gh issue close $html_url -c "Closed due to being marked as wont fix" -r "not planned"
            fi
          done
