name: Close Discussion on PR Merge

on:
  pull_request:
    types: [closed]

jobs:
  close-discussion:
    runs-on: runner-cluster-htl-set

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
        with:
          repository: community-scripts/ProxmoxVE
          ref: main
          token: ${{ secrets.GITHUB_TOKEN }}  

      - name: Set Up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Install Dependencies
        run: npm install zx @octokit/graphql

      - name: Close Discussion
        env:
          GITHUB_TOKEN: ${{ secrets.PAT_MICHEL }}
          PR_BODY: ${{ github.event.pull_request.body }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
          REPO_OWNER: ${{ github.repository_owner }}
          REPO_NAME: ${{ github.event.repository.name }}
        run: |
          npx zx << 'EOF'
          import { graphql } from "@octokit/graphql";
          (async function() {
            try {
              const token = process.env.GITHUB_TOKEN;
              const prBody = process.env.PR_BODY;
              const prNumber = process.env.PR_NUMBER;
              const owner = process.env.REPO_OWNER;
              const repo = process.env.REPO_NAME;

              if (!token || !prBody || !prNumber || !owner || !repo) {
                console.log("Missing required environment variables.");
                process.exit(1);
              }

              const match = prBody.match(/#(\d+)/);
              if (!match) {
                console.log("No discussion ID found in PR body.");
                return;
              }
              const discussionNumber = match[1];

              console.log(`Extracted Discussion Number: ${discussionNumber}`);
              console.log(`PR Number: ${prNumber}`);
              console.log(`Repository: ${owner}/${repo}`);

              const graphqlWithAuth = graphql.defaults({
                headers: { authorization: `Bearer ${token}` },
              });

              const discussionQuery = `
                query($owner: String!, $repo: String!, $number: Int!) {
                  repository(owner: $owner, name: $repo) {
                    discussion(number: $number) {
                      id
                    }
                  }
                }
              `;
              
              const discussionResponse = await graphqlWithAuth(discussionQuery, {
                  owner,
                  repo,
                  number: parseInt(discussionNumber, 10),
              });              
              
              const discussionQLId = discussionResponse.repository.discussion.id;
              if (!discussionQLId) {
                console.log("Failed to fetch discussion GraphQL ID.");
                return;
              }

              console.log(`GraphQL Discussion ID: ${discussionQLId}`);
              
              const commentMutation = `
                mutation($discussionId: ID!, $body: String!) {
                  addDiscussionComment(input: { discussionId: $discussionId, body: $body }) {
                    comment { id body }
                  }
                }
              `;

              const commentResponse = await graphqlWithAuth(commentMutation, {
                discussionId: discussionQLId,
                body: `Merged with PR #${prNumber}`,
              });

              const commentId = commentResponse.addDiscussionComment.comment.id;
              if (!commentId) {
                console.log("Failed to post the comment.");
                return;
              }

              console.log(`Comment Posted Successfully! Comment ID: ${commentId}`);

              const markAnswerMutation = `
                mutation($id: ID!) {
                  markDiscussionCommentAsAnswer(input: { id: $id }) {
                    discussion { id title }
                  }
                }
              `;

              await graphqlWithAuth(markAnswerMutation, { id: commentId });

              console.log("Comment marked as answer successfully!");

            } catch (error) {
              console.error("Error:", error);
              return;
            }
          })();
          EOF