name: Build JPY distributions

on:
  pull_request:
    branches: [ 'master', 'release/v*' ]
  push:
    branches: [ 'master', 'release/v*' ]

jobs:
  jars:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-java@v5
        with:
          distribution: 'temurin'
          java-version: '8'
      - run: mvn --batch-mode jar:jar javadoc:jar source:jar-no-fork
      - uses: actions/upload-artifact@v4
        with:
          name: jars
          path: target

  sdist:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-python@v6
      # TODO: sdist shouldn't need java
      - uses: actions/setup-java@v5
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: '8'
      - run: python setup.py sdist
      - uses: actions/upload-artifact@v4
        with:
          name: sdist
          path: dist

  bdist-wheel:
    runs-on: ${{ matrix.info.machine }}
    strategy:
      fail-fast: false
      matrix:
        info:
          # Note: the free-threaded Linux wheels are not currently buildable via the docker bake workflow due to the
          # limitations of the current image (docker.io/library/python:X doesn't provide free-threaded versions). Using
          # the oldest available GitHub Linux runner image (ubuntu-22.04 / ubuntu-22.04-arm), we are able to use get
          # the free-threaded builds via actions/setup-python. This produces a manylinux_2_34 compatible wheel (as
          # opposed to manylinux_2_17 produced via the docker bake process). This is a compromise that seems reasonable
          # given the more experimental nature of the free-threaded builds, coupled with the fact that python 3.13t is
          # less likely to be used on older Linux distributions.
          - { machine: 'ubuntu-22.04', python: '3.13t', java: '8', cmd: '.github/env/Linux/bdist-wheel.sh' }
          - { machine: 'ubuntu-22.04-arm', python: '3.13t',  java: '8', cmd: '.github/env/Linux/bdist-wheel.sh' }
          - { machine: 'ubuntu-22.04', python: '3.14t', java: '8',cmd: '.github/env/Linux/bdist-wheel.sh' }
          - { machine: 'ubuntu-22.04-arm', python: '3.14t', java: '8', cmd: '.github/env/Linux/bdist-wheel.sh' }

          - { machine: 'windows-2022', python: '3.9', java: '8',  cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.10', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.11', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.12', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.13', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.13t', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.14', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }
          - { machine: 'windows-2022', python: '3.14t', java: '8', cmd: '.\.github\env\Windows\bdist-wheel.ps1' }

          - { machine: 'macos-14', python: '3.11', java: '11', cmd: '.github/env/macOS/bdist-wheel.sh' }
          - { machine: 'macos-14', python: '3.12', java: '11', cmd: '.github/env/macOS/bdist-wheel.sh' }
          - { machine: 'macos-14', python: '3.13', java: '11', cmd: '.github/env/macOS/bdist-wheel.sh' }
          - { machine: 'macos-14', python: '3.13t', java: '11', cmd: '.github/env/macOS/bdist-wheel.sh' }
          - { machine: 'macos-14', python: '3.14', java: '11', cmd: '.github/env/macOS/bdist-wheel.sh' }
          - { machine: 'macos-14', python: '3.14t', java: '11', cmd: '.github/env/macOS/bdist-wheel.sh' }


    steps:
      - uses: actions/checkout@v5

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.info.python }}

      - uses: actions/setup-java@v5
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: ${{ matrix.info.java }}

      - run: ${{ matrix.info.cmd }}

      - uses: actions/upload-artifact@v4
        with:
          name: build-${{ matrix.info.python }}-${{ matrix.info.machine }}
          path: dist/*.whl
          retention-days: 1

  # Python 3.6, 3.7 doesn't support M1 support at all.
  # Python 3.11, 3.12 builds have universal2 defaults:
  # https://github.com/actions/runner-images/issues/4133
  # Python 3.9 builds _had_ universal2 defaults for a short period of time before it was reverted:
  # https://github.com/actions/python-versions/pull/114, https://github.com/actions/python-versions/pull/175
  # Regardless, we can explicitly instruct python at compile time to create universal2 packages:
  # https://github.com/pypa/cibuildwheel/blob/v2.16.2/cibuildwheel/macos.py#L247-L260
  # Note: using macosx-11.0-universal2 instead of macosx-10.9-universal2, as the build warns otherwise that the version
  # was bumped to 11.0 because the underlying python build has a minimum of 11.0.
  # There might be a better solution for this in the future:
  # https://github.com/actions/setup-python/issues/547
  bdist-wheel-universal2-hack:
    runs-on: ${{ matrix.info.machine }}
    env:
      _PYTHON_HOST_PLATFORM: macosx-11.0-universal2
      ARCHFLAGS: -arch arm64 -arch x86_64
    strategy:
      fail-fast: false
      matrix:
        info:
          - { machine: 'macos-14', python: '3.9', cmd: '.github/env/macOS/bdist-wheel.sh' }
          - { machine: 'macos-14', python: '3.10', cmd: '.github/env/macOS/bdist-wheel.sh' }

    steps:
      - uses: actions/checkout@v5

      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.info.python }}

      - uses: actions/setup-java@v5
        id: setup-java
        with:
          distribution: 'temurin'
          java-version: '11'

      - run: pip install --upgrade pip
      - run: pip install --upgrade setuptools
      - run: ${{ matrix.info.cmd }}

      - uses: actions/upload-artifact@v4
        with:
          name: build-${{ matrix.info.python }}-${{ matrix.info.machine }}
          path: dist/*.whl
          retention-days: 1

  bdist-wheel-linux-arm64:
    runs-on: 'ubuntu-24.04-arm'
    steps:
      - uses: actions/checkout@v5

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - run: mkdir /tmp/dist

      - name: Bake
        uses: docker/bake-action@v6.9.0
        env:
          DOCKER_BUILD_RECORD_UPLOAD: false
        with:
          files: .github/docker/docker-bake.hcl
          pull: true
          set: |
            *.output=type=local,dest=/tmp/dist

      - uses: actions/upload-artifact@v4
        with:
          name: bdist-wheel-linux-arm64
          path: /tmp/dist/*.whl
          retention-days: 1

  bdist-wheel-linux-amd64:
    runs-on: 'ubuntu-24.04'
    steps:
      - uses: actions/checkout@v5

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - run: mkdir /tmp/dist

      - name: Bake
        uses: docker/bake-action@v6.9.0
        env:
          DOCKER_BUILD_RECORD_UPLOAD: false
        with:
          files: .github/docker/docker-bake.hcl
          pull: true
          set: |
            *.output=type=local,dest=/tmp/dist

      - uses: actions/upload-artifact@v4
        with:
          name: bdist-wheel-linux-amd64
          path: /tmp/dist/*.whl
          retention-days: 1

  collect-artifacts:
    runs-on: ubuntu-24.04
    needs: ['sdist', 'bdist-wheel', 'bdist-wheel-universal2-hack', 'bdist-wheel-linux-amd64', 'bdist-wheel-linux-arm64']
    steps:
      - uses: actions/checkout@v5
      - uses: actions/download-artifact@v4
        with:
          path: download-artifacts
      - name: collect-artifacts.sh
        run: .github/scripts/collect-artifacts.sh
      - uses: actions/upload-artifact@v4
        with:
          name: jpy
          path: collect-artifacts

  release-artifacts:
    if: ${{ startsWith(github.ref, 'refs/heads/release/v') }}
    runs-on: ubuntu-24.04
    needs: ['collect-artifacts']
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: jpy
          path: dist
      - name: Publish package to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}

  publish-jar:
    if: ${{ startsWith(github.ref, 'refs/heads/release/v') }}
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-java@v5
        with:
          distribution: 'temurin'
          java-version: '8'
          server-id: central
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
          gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
          gpg-passphrase: GPG_PASSPHRASE
      - name: Publish package
        run: mvn --batch-mode deploy -Pjpy-maven-deploy -DskipTests
        env:
          MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN }}
          GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}