name: Release (Part 2 of 2)

on:
  # this workflow will run any time any PR into main is closed
  pull_request:
    types: [closed]
    branches:
      - main

  workflow_dispatch:
    inputs:
      version:
        required: true
        type: string

env:
  GITHUB_TOKEN: ${{ secrets.AUTORELEASE_BOT_PAT }}

jobs:
  roll_back_release:
    # run this job if a PR from an autorelease branch into main was closed without merging
    if: startsWith(github.head_ref, 'autorelease') && github.event.pull_request.merged != true
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Extract version from autorelease branch name
        run: echo "VERSION=$(echo ${{ github.head_ref }} | cut -c 13-)" >> $GITHUB_ENV

      - name: Roll back on failure
        uses: ./.github/actions/rollback_release
        with:
          VERSION: ${{ env.VERSION }}
          GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }}

  publish_release:
    # run this job if a PR was merged from an autorelease branch into main
    # or if manually triggered, github.head_ref is undefined
    if: ${{ ! github.head_ref || (startsWith(github.head_ref, 'autorelease') && github.event.pull_request.merged == true) }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        run: pip install twine

      - name: Extract version from autorelease branch name
        if: ${{ github.head_ref }}
        run: echo "VERSION=$(echo ${{ github.head_ref }} | cut -c 13-)" >> $GITHUB_ENV

      - name: Get version from manual trigger input
        if: ${{ ! github.head_ref }}
        run: echo "VERSION=${{ inputs.version }}" >> $GITHUB_ENV

      - name: Find actions run for the $VERSION tag
        run: |
          echo "RUN_ID=$( \
            gh run list \
              --branch $VERSION \
              --workflow 'Run Tests and Build' \
              --limit 1 \
              --json databaseId \
              --jq .[].databaseId)" >> $GITHUB_ENV

      - name: Download release artifacts
        run: |
          mkdir artifacts
          # this will download a folder containing each artifact
          gh run download $RUN_ID --dir artifacts --pattern "Wheel for *"
          # move the artifacts out of the folders
          mv artifacts/*/* artifacts
          rm -rf artifacts/Wheel*

          # download each artifact separately so that the command will fail if any is missing
          for artifact in Workbench-Windows-binary \
                          Workbench-macOS-binary \
                          InVEST-sample-data \
                          InVEST-user-guide \
                          "Source distribution"
          do
            gh run download $RUN_ID --dir artifacts --name "$artifact"
          done

      - name: Create Github release
        run: |
          # Copy the history notes for this version into the release message
          echo "This release includes the following fixes and features:" > notes.rst
          echo "" >> notes.rst
          sed -n "/$VERSION/,/^$/p" HISTORY.rst | tail -n +3 >> notes.rst
          gh release create $VERSION \
            --verify-tag \
            --title $VERSION \
            --notes-file notes.rst \
            artifacts/*

      - name: Create a PyPI release
        # this is the only step that can't be rolled back
        run: |
          twine upload \
            --username="__token__" \
            --password=${{ secrets.PYPI_NATCAP_INVEST_TOKEN }} \
            artifacts/natcap.invest* artifacts/natcap_invest*

      - name: Roll back on failure
        if: failure()
        uses: ./.github/actions/rollback_release
        with:
          VERSION: ${{ env.VERSION }}
          GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }}
