# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Publish the fluss Python binding to PyPI.
# Trigger: push tag only (e.g. v0.1.0).
# Pre-release tags (containing '-') publish to TestPyPI; release tags publish to PyPI.
#
# Token auth: set repo variable PYPI_USE_TOKEN_AUTH = 'true' and add secrets PYPI_API_TOKEN / TEST_PYPI_API_TOKEN.
# Trusted Publishing (OIDC): leave PYPI_USE_TOKEN_AUTH unset; do not pass password so the action uses OIDC.

name: Release Python

on:
  push:
    tags:
      - "v*"  # Only version-like tags (e.g. v0.1.0, v0.1.0-rc1); avoids running on arbitrary tags

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  version-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/verify-tag-version

  sdist:
    runs-on: ubuntu-latest
    needs: [version-check]
    steps:
      - uses: actions/checkout@v4

      - name: Generate Python README
        run: python bindings/python/generate_readme.py

      - name: Install protoc
        run: sudo apt-get update && sudo apt-get install -y protobuf-compiler

      - uses: PyO3/maturin-action@v1
        with:
          working-directory: bindings/python
          command: sdist
          args: -o dist

      - name: Upload sdist
        uses: actions/upload-artifact@v4
        with:
          name: wheels-sdist
          path: bindings/python/dist

  wheels:
    runs-on: ${{ matrix.os }}
    needs: [version-check]
    strategy:
      matrix:
        include:
          - { os: windows-latest }
          - { os: macos-15-intel, target: "x86_64-apple-darwin" }
          - { os: macos-15, target: "aarch64-apple-darwin" }
          - { os: ubuntu-latest, target: "x86_64" }
          - { os: ubuntu-latest, target: "aarch64", manylinux: "manylinux_2_28" }
    steps:
      - uses: actions/checkout@v4

      - name: Generate Python README
        run: python3 bindings/python/generate_readme.py

      - name: Install protoc (Linux)
        if: runner.os == 'Linux'
        run: sudo apt-get update && sudo apt-get install -y protobuf-compiler

      - name: Install protoc (macOS)
        if: runner.os == 'macOS'
        run: brew install protobuf

      - name: Install protoc (Windows)
        if: runner.os == 'Windows'
        run: choco install protoc -y
        shell: pwsh

      # Install protoc in manylinux container (x86_64/aarch64); script shared via YAML anchor
      - uses: PyO3/maturin-action@v1
        with:
          working-directory: bindings/python
          target: ${{ matrix.target }}
          command: build
          args: --release -o dist -i python3.9
          manylinux: ${{ matrix.manylinux || 'auto' }}
          container: ${{ matrix.os == 'ubuntu-latest' && matrix.target == 'x86_64' && 'off' || '' }}
          before-script-linux: &protoc-install |
            set -e
            ARCH=$(uname -m)
            case "$ARCH" in
              x86_64)  ZIP=protoc-27.1-linux-x86_64.zip ;;
              aarch64) ZIP=protoc-27.1-linux-aarch_64.zip ;;
              *) echo "Unsupported arch $ARCH"; exit 1 ;;
            esac
            curl -sLO "https://github.com/protocolbuffers/protobuf/releases/download/v27.1/${ZIP}"
            python3 -c "import zipfile; zipfile.ZipFile('${ZIP}').extractall('/tmp/protoc_install')"
            chmod +x /tmp/protoc_install/bin/protoc
            rm -f "${ZIP}"
            export PATH="/tmp/protoc_install/bin:$PATH"
            export PROTOC=/tmp/protoc_install/bin/protoc
      - uses: PyO3/maturin-action@v1
        with:
          working-directory: bindings/python
          target: ${{ matrix.target }}
          command: build
          args: --release -o dist -i python3.10
          manylinux: ${{ matrix.manylinux || 'auto' }}
          container: ${{ matrix.os == 'ubuntu-latest' && matrix.target == 'x86_64' && 'off' || '' }}
          before-script-linux: *protoc-install
      - uses: PyO3/maturin-action@v1
        with:
          working-directory: bindings/python
          target: ${{ matrix.target }}
          command: build
          args: --release -o dist -i python3.11
          manylinux: ${{ matrix.manylinux || 'auto' }}
          container: ${{ matrix.os == 'ubuntu-latest' && matrix.target == 'x86_64' && 'off' || '' }}
          before-script-linux: *protoc-install
      - uses: PyO3/maturin-action@v1
        with:
          working-directory: bindings/python
          target: ${{ matrix.target }}
          command: build
          args: --release -o dist -i python3.12
          manylinux: ${{ matrix.manylinux || 'auto' }}
          container: ${{ matrix.os == 'ubuntu-latest' && matrix.target == 'x86_64' && 'off' || '' }}
          before-script-linux: *protoc-install

      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ matrix.os }}-${{ matrix.target || 'native' }}
          path: bindings/python/dist

  release:
    name: Publish to PyPI
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
    needs: [version-check, sdist, wheels]
    if: startsWith(github.ref, 'refs/tags/')
    steps:
      - uses: actions/download-artifact@v4
        with:
          pattern: wheels-*
          merge-multiple: true
          path: bindings/python/dist

      - name: Publish to TestPyPI (token)
        if: contains(github.ref, '-') && vars.PYPI_USE_TOKEN_AUTH == 'true'
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
          skip-existing: true
          packages-dir: bindings/python/dist
          password: ${{ secrets.TEST_PYPI_API_TOKEN }}

      - name: Publish to TestPyPI (Trusted Publishing)
        if: contains(github.ref, '-') && vars.PYPI_USE_TOKEN_AUTH != 'true'
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
          skip-existing: true
          packages-dir: bindings/python/dist

      - name: Publish to PyPI (token)
        if: ${{ !contains(github.ref, '-') && vars.PYPI_USE_TOKEN_AUTH == 'true' }}
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          skip-existing: true
          packages-dir: bindings/python/dist
          password: ${{ secrets.PYPI_API_TOKEN }}

      - name: Publish to PyPI (Trusted Publishing)
        if: ${{ !contains(github.ref, '-') && vars.PYPI_USE_TOKEN_AUTH != 'true' }}
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          skip-existing: true
          packages-dir: bindings/python/dist
