---
# This action is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo.

# Use the `rtd` repository label to identify repositories that should trigger have this workflow.
# If the project slug is not the repository name, add a repository variable named `READTHEDOCS_SLUG` with the value of
# the ReadTheDocs project slug.

# Update readthedocs on release events.

name: Update docs

on:
  release:
    types: [created, edited, deleted]

concurrency:
  group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
  cancel-in-progress: true

jobs:
  update-docs:
    env:
      RTD_SLUG: ${{ vars.READTHEDOCS_SLUG }}
      RTD_TOKEN: ${{ secrets.READTHEDOCS_TOKEN }}
      TAG: ${{ github.event.release.tag_name }}
    if: >-
      !github.event.release.draft
    runs-on: ubuntu-latest
    steps:
      - name: Get RTD_SLUG
        run: |
          # if the RTD_SLUG is not set, use the repository name in lowercase
          if [ -z "${RTD_SLUG}" ]; then
              RTD_SLUG=$(echo "${{ github.event.repository.name }}" | tr '[:upper:]' '[:lower:]')
          fi
          echo "RTD_SLUG=${RTD_SLUG}" >> $GITHUB_ENV

      - name: Deactivate deleted release
        if: >-
          github.event_name == 'release' &&
          github.event.action == 'deleted'
        run: |
          json_body=$(jq -n \
            --arg active "false" \
            --arg hidden "false" \
            --arg privacy_level "public" \
            '{active: $active, hidden: $hidden, privacy_level: $privacy_level}')

          curl \
            -X PATCH \
            -H "Authorization: Token ${RTD_TOKEN}" \
              https://readthedocs.org/api/v3/projects/${RTD_SLUG}/versions/${TAG}/ \
            -H "Content-Type: application/json" \
            -d "$json_body"

      - name: Check if edited release is latest GitHub release
        id: check
        if: >-
          github.event_name == 'release' &&
          github.event.action == 'edited'
        uses: actions/github-script@v7
        with:
          script: |
            const latestRelease = await github.rest.repos.getLatestRelease({
              owner: context.repo.owner,
              repo: context.repo.repo
            });

            core.setOutput('isLatestRelease', latestRelease.data.tag_name === context.payload.release.tag_name);

      - name: Update RTD project
        # changing the default branch in readthedocs makes "latest" point to that branch/tag
        # we can also update other properties like description, etc.
        if: >-
          steps.check.outputs.isLatestRelease == 'true'
        run: |
          json_body=$(jq -n \
            --arg default_branch "${TAG}" \
            --arg description "${{ github.event.repository.description }}" \
            '{default_branch: $default_branch}')

          # change the default branch to the latest release
          curl \
            -X PATCH \
            -H "Authorization: Token ${RTD_TOKEN}" \
            -H "Content-Type: application/json" \
            https://readthedocs.org/api/v3/projects/${RTD_SLUG}/ \
            -d "$json_body"

          # trigger a build for the latest version
          curl \
            -X POST \
            -H "Authorization: Token ${RTD_TOKEN}" \
            https://readthedocs.org/api/v3/projects/${RTD_SLUG}/versions/latest/builds/
