name: 'Repository Maintenance'

on:
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

permissions:
  issues: write
  pull-requests: write
  discussions: write

concurrency:
  group: lock

jobs:
  stale:
    name: 'Stale'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v8
        with:
          days-before-stale: 7
          days-before-close: 14
          any-of-labels: 'cant-reproduce,not a bug'
          stale-issue-label: stale
          stale-pr-label: stale
          stale-issue-message: >
            This issue has been automatically marked as stale because it has not had
            recent activity. It will be closed if no further activity occurs. Thank you
            for your contributions.
  lock-threads:
    name: 'Lock Old Threads'
    runs-on: ubuntu-latest
    steps:
      - uses: dessant/lock-threads@v4
        with:
          issue-inactive-days: '30'
          pr-inactive-days: '30'
          log-output: true
          issue-comment: >
            This issue has been automatically locked since there
            has not been any recent activity after it was closed.
            Please open a new discussion or issue for related concerns.
          pr-comment: >
            This pull request has been automatically locked since there
            has not been any recent activity after it was closed.
            Please open a new discussion or issue for related concerns.
  close-answered-discussions:
    name: 'Close Answered Discussions'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v6
        with:
          script: |
            const query = `query($owner:String!, $name:String!) {
              repository(owner:$owner, name:$name){
                discussions(first:100, answered:true, states:[OPEN]) {
                  nodes {
                    id,
                    number
                  }
                }
              }
            }`;
            const variables = {
              owner: context.repo.owner,
              name: context.repo.repo,
            }
            const result = await github.graphql(query, variables)

            console.log(`Found ${result.repository.discussions.nodes.length} open answered discussions`)

            for (const discussion of result.repository.discussions.nodes) {
              console.log(`Closing dicussion #${discussion.number} (${discussion.id})`)

              const addCommentMutation = `mutation($discussion:ID!, $body:String!) {
                addDiscussionComment(input:{discussionId:$discussion, body:$body}) {
                  clientMutationId
                }
              }`;
              const commentVariables = {
                discussion: discussion.id,
                body: 'This discussion has been automatically closed because it was marked as answered.',
              }
              await github.graphql(addCommentMutation, commentVariables)

              const closeDiscussionMutation = `mutation($discussion:ID!, $reason:DiscussionCloseReason!) {
                closeDiscussion(input:{discussionId:$discussion, reason:$reason}) {
                  clientMutationId
                }
              }`;
              const closeVariables = {
                discussion: discussion.id,
                reason: "RESOLVED",
              }
              await github.graphql(closeDiscussionMutation, closeVariables)

            }
