name: PyPI Release

on:
  workflow_dispatch:
    inputs:
      publish_package:
        description: 'Publish build on PyPi? [true/false]'
        required: true
        default: 'false'

jobs:
  build-and-release:
    if: github.repository == 'invoke-ai/InvokeAI'
    runs-on: ubuntu-22.04
    env:
      TWINE_USERNAME: __token__
      TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
      TWINE_NON_INTERACTIVE: 1
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node 18
        uses: actions/setup-node@v4
        with:
          node-version: '18'

      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: '8.12.1'

      - name: Install frontend dependencies
        run: pnpm install --prefer-frozen-lockfile
        working-directory: invokeai/frontend/web

      - name: Build frontend
        run: pnpm run build
        working-directory: invokeai/frontend/web

      - name: Install python dependencies
        run: pip install --upgrade build twine

      - name: Build python package
        run: python3 -m build

      - name: Upload build as workflow artifact
        uses: actions/upload-artifact@v4
        with:
          name: dist
          path: dist

      - name: Check distribution
        run: twine check dist/*

      - name: Check PyPI versions
        if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')
        run: |
          pip install --upgrade requests
          python -c "\
          import scripts.pypi_helper; \
          EXISTS=scripts.pypi_helper.local_on_pypi(); \
          print(f'PACKAGE_EXISTS={EXISTS}')" >> $GITHUB_ENV

      - name: Publish build on PyPi
        if: env.PACKAGE_EXISTS == 'False' && env.TWINE_PASSWORD != '' && github.event.inputs.publish_package == 'true'
        run: twine upload dist/*