name: Publish to PyPI
on:
  pull_request:
  release:
    types: [published]
  push:
    tags: ["v*"]

concurrency:
  group: publish-pypi-{{ github.sha }}
  cancel-in-progress: false

jobs:
  build-packages:
    name: Build packages
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Get tags
        run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
        shell: bash

      - uses: actions/setup-python@v6
        with:
          python-version: "3.12"

      - name: Build package
        run: |
          python -m pip install --upgrade pip wheel setuptools setuptools_scm build twine
          python -m build --sdist --wheel . --outdir dist

      - name: Check files
        run: |
          ls dist
        shell: bash

      - name: Test wheels
        run: |
          pushd dist
          python -m pip install ultraplot*.whl

          version=$(python -c "import ultraplot; print(ultraplot.__version__)")
          echo "Version: $version"
          if [[ "$version" == "0."* ]]; then
            echo "Version is not set correctly!"
            exit 1
          fi

          python -m twine check *
          popd
        shell: bash

      - name: Upload artifacts
        uses: actions/upload-artifact@v6
        with:
          name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
          path: dist/*
          if-no-files-found: error

  publish-pypi-test:
    name: Publish to TestPyPI
    needs: build-packages
    if: github.event_name != 'pull_request'
    environment:
      name: test
      url: https://test.pypi.org/project/ultraplot/
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v7
        with:
          name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
          path: dist

      - name: Check files
        run: |
          ls dist
        shell: bash

      - name: Publish to TestPyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
          verbose: true
          # releases generate both release and tag events so
          # we get a race condition if we don't skip existing
          skip-existing: ${{ (github.event_name == 'release' || github.event_name == 'push') && 'true' || 'false' }}

  publish-pypi:
    name: Publish to PyPI
    needs: publish-pypi-test
    environment:
      name: prod
      url: https://pypi.org/project/ultraplot/
    runs-on: ubuntu-latest
    if: github.event_name == 'release'
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v7
        with:
          name: dist-${{ github.sha }}-${{ github.run_id }}-${{ github.run_number }}
          path: dist

      - name: Check files
        run: |
          ls dist
        shell: bash

      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          verbose: true
