name: Code size comment

on:
  workflow_run:
    workflows: [Check code size]
    types: [completed]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  comment:
    runs-on: ubuntu-22.04
    steps:
      - name: 'Download artifact'
        id: download-artifact
        uses: actions/github-script@v8
        with:
          result-encoding: string
          script: |
            const fs = require('fs');

            const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
               owner: context.repo.owner,
               repo: context.repo.repo,
               run_id: context.payload.workflow_run.id,
            });

            const matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
              return artifact.name == "code-size-report"
            });

            if (matchArtifact.length === 0) {
              console.log('no matching artifact found');
              console.log('result: "skip"');

              return 'skip';
            }

            const download = await github.rest.actions.downloadArtifact({
               owner: context.repo.owner,
               repo: context.repo.repo,
               artifact_id: matchArtifact[0].id,
               archive_format: 'zip',
            });

            fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/code-size-report.zip`, Buffer.from(download.data));

            console.log('artifact downloaded to `code-size-report.zip`');
            console.log('result: "ok"');

            return 'ok';
      - name: 'Unzip artifact'
        if: steps.download-artifact.outputs.result == 'ok'
        run: unzip code-size-report.zip
      - name: Post comment to pull request
        if: steps.download-artifact.outputs.result == 'ok'
        uses: actions/github-script@v8
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            const fs = require('fs');

            const prNumber = Number(fs.readFileSync('pr_number'));
            const codeSizeReport = `Code size report:

            \`\`\`
            ${fs.readFileSync('diff')}
            \`\`\`
            `;

            const comments = await github.paginate(
              github.rest.issues.listComments,
              {
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
              }
            );

            comments.reverse();

            const previousComment = comments.find(comment =>
              comment.user.login === 'github-actions[bot]'
            )

            // if github-actions[bot] already made a comment, update it,
            // otherwise create a new comment.

            if (previousComment) {
              await github.rest.issues.updateComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                comment_id: previousComment.id,
                body: codeSizeReport,
              });
            } else {
              await github.rest.issues.createComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: prNumber,
                body: codeSizeReport,
              });
            }
