name: (Shared) Check maintainer

on:
  workflow_call:
    inputs:
      actor:
        required: true
        type: string
      is_remote:
        required: false
        type: boolean
        default: false
    outputs:
      is_core_team:
        value: ${{ jobs.check_maintainer.outputs.is_core_team }}

env:
  TZ: /usr/share/zoneinfo/America/Los_Angeles
  # https://github.com/actions/cache/blob/main/tips-and-workarounds.md#cache-segment-restore-timeout
  SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1

jobs:
  check_maintainer:
    runs-on: ubuntu-latest
    outputs:
      is_core_team: ${{ steps.check_if_actor_is_maintainer.outputs.result }}
    steps:
      - uses: actions/checkout@v4
      - name: Check if actor is maintainer
        id: check_if_actor_is_maintainer
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const actor = '${{ inputs.actor }}';
            let isRemote = ${{ inputs.is_remote }};
            if (typeof isRemote === 'string') {
              isRemote = isRemote === 'true';
            }
            if (typeof isRemote !== 'boolean') {
              throw new Error(`Invalid \`isRemote\` input. Expected a boolean, got: ${isRemote}`);
            }

            let content = null;
            if (isRemote === true) {
              const res = await github.rest.repos.getContent({
                owner: 'facebook',
                repo: 'react',
                path: 'MAINTAINERS',
                ref: 'main',
                headers: { Accept: 'application/vnd.github+json' }
              });
              if (res.status !== 200) {
                console.error(res);
                throw new Error('Unable to fetch MAINTAINERS file');
              }
              content = Buffer.from(res.data.content, 'base64').toString();
            } else {
              content = await fs.readFileSync('./MAINTAINERS', { encoding: 'utf8' });
            }
            if (content === null) {
              throw new Error('Unable to retrieve local or http MAINTAINERS file');
            }

            const maintainers = new Set(content.split('\n'));
            if (maintainers.has(actor)) {
              console.log(`🟢 ${actor} is a maintainer`);
              return true;
            }
            console.log(`🔴 ${actor} is NOT a maintainer`);
            return null;