name: Documentation
on:
  push:
    branches:
      - 'main'
    tags:
      - '**'
  workflow_dispatch:
    inputs:
      ref:
        description: 'The branch, tag or SHA to checkout'
        required: true
      ref_type:
        type: choice
        description: 'Branch or tag'
        options:
          - branch
          - tag
        required: true
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true
jobs:
  build:
    name: Build documentation
    runs-on: ubuntu-latest
    env:
      TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
      TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
    outputs:
      BRANCH_NAME: ${{ steps.env.outputs.BRANCH_NAME }}
      BRANCH_OR_TAG: ${{ steps.env.outputs.BRANCH_OR_TAG }}
      SHA: ${{ steps.env.outputs.SHA }}
    if: github.repository_owner == 'discordjs'
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.inputs.ref || '' }}

      - name: Install node.js v16
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: 'yarn'

      - name: Install dependencies
        run: yarn --immutable

      - name: Build dependencies
        run: yarn build

      - name: Build docs
        run: yarn docs

      - name: Upload docgen artifacts
        uses: actions/upload-artifact@v3
        with:
          name: docgen
          path: packages/*/docs/docs.json

      - name: Upload api-extractor artifacts
        uses: actions/upload-artifact@v3
        with:
          name: api-extractor
          path: packages/*/docs/docs.api.json

      - name: Set outputs for upload job
        id: env
        run: |
          echo "::set-output name=BRANCH_NAME::${GITHUB_REF_NAME}"
          echo "::set-output name=BRANCH_OR_TAG::${GITHUB_REF_TYPE}"
          echo "::set-output name=SHA::${GITHUB_SHA}"

  upload:
    name: Upload Documentation
    needs: build
    strategy:
      max-parallel: 1
      fail-fast: false
      matrix:
        package: ['builders', 'collection', 'discord.js', 'proxy', 'rest', 'voice', 'ws']
    runs-on: ubuntu-latest
    env:
      TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
      TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
      BRANCH_NAME: ${{ github.event.inputs.ref || needs.build.outputs.BRANCH_NAME }}
      BRANCH_OR_TAG: ${{ github.event.inputs.ref_type || needs.build.outputs.BRANCH_OR_TAG }}
      SHA: ${{ needs.build.outputs.SHA }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Install node.js v16
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: 'yarn'

      - name: Install dependencies
        run: yarn --immutable

      - name: Build actions
        run: yarn workspace @discordjs/actions build

      - name: Download docgen artifacts
        uses: actions/download-artifact@v3
        with:
          name: docgen
          path: docs

      - name: Download api-extractor artifacts
        uses: actions/download-artifact@v3
        with:
          name: api-extractor
          path: docs

      - name: Checkout docs repository
        uses: actions/checkout@v3
        with:
          repository: 'discordjs/docs'
          token: ${{ secrets.DJS_DOCS }}
          path: 'out'

      - name: Extract package and semver from tag
        if: ${{ env.BRANCH_OR_TAG == 'tag' }}
        id: extract-tag
        uses: ./packages/actions/src/formatTag
        with:
          tag: ${{ env.BRANCH_NAME }}

      - name: Move docs to correct directory
        if: ${{ env.BRANCH_OR_TAG == 'tag' && matrix.package == steps.extract-tag.outputs.package }}
        env:
          PACKAGE: ${{ steps.extract-tag.outputs.package }}
          SEMVER: ${{ steps.extract-tag.outputs.semver }}
        run: |
          mkdir -p out/${PACKAGE}
          mv docs/${PACKAGE}/docs/docs.json out/${PACKAGE}/${SEMVER}.json
          if [[ $PACKAGE != "discord.js" ]]; then
            mv docs/${PACKAGE}/docs/docs.api.json out/${PACKAGE}/${SEMVER}.api.json
          fi

      - name: Move docs to correct directory
        if: ${{ env.BRANCH_OR_TAG == 'branch' }}
        env:
          PACKAGE: ${{ matrix.package }}
        run: |
          mkdir -p out/${PACKAGE}
          mv docs/${PACKAGE}/docs/docs.json out/${PACKAGE}/${BRANCH_NAME}.json
          if [[ $PACKAGE != "discord.js" ]]; then
            mv docs/${PACKAGE}/docs/docs.api.json out/${PACKAGE}/${BRANCH_NAME}.api.json
          fi

      - name: Commit and push
        run: |
          cd out
          git config user.name github-actions[bot]
          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
          git add .
          git commit -m "Docs build for ${BRANCH_OR_TAG} ${BRANCH_NAME}: ${SHA}" || true
          git push
