# 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.

# Build the paimon-ftindex Python release wheels.
#
# Trigger: called by release.yml or manually dispatched.
# Publishing is handled by release-python-publish.yml after wheels are built.

name: Release Python Wheels

on:
  workflow_call:
  workflow_dispatch:

concurrency:
  group: release-python-${{ github.ref }}
  cancel-in-progress: false

permissions:
  contents: read

jobs:
  wheels-linux:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            arch: x86_64
          - os: ubuntu-24.04-arm
            arch: aarch64
    steps:
      - uses: actions/checkout@v6

      - name: Inject RC version into pyproject.toml
        if: startsWith(github.ref, 'refs/tags/') && contains(github.ref_name, '-rc')
        run: |
          TAG="${GITHUB_REF#refs/tags/v}"
          # Convert 0.1.0-rc1 to PEP 440: 0.1.0rc1
          PEP440_VERSION=$(echo "$TAG" | sed 's/-rc/rc/')
          sed -i "s/^version = .*/version = \"${PEP440_VERSION}\"/" python/pyproject.toml

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Build wheels via cibuildwheel
        uses: pypa/cibuildwheel@294735312765b09d24a2fbec22660ce817587d55
        with:
          package-dir: python
          output-dir: wheelhouse
        env:
          CIBW_BUILD: "cp39-manylinux_${{ matrix.arch }}"
          CIBW_MANYLINUX_X86_64_IMAGE: manylinux_2_28
          CIBW_MANYLINUX_AARCH64_IMAGE: manylinux_2_28
          CIBW_BEFORE_ALL_LINUX: >
            curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y &&
            source $HOME/.cargo/env &&
            cargo build --release -p paimon-ftindex-ffi &&
            cp target/release/libpaimon_ftindex_ffi.so {package}/paimon_ftindex/

      - name: Upload wheels
        uses: actions/upload-artifact@v5
        with:
          name: wheels-linux-${{ matrix.arch }}
          path: wheelhouse/*.whl

  wheels-macos:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: macos-latest
            target: aarch64-apple-darwin
            lib_name: libpaimon_ftindex_ffi.dylib
    steps:
      - uses: actions/checkout@v6

      - name: Inject RC version into pyproject.toml
        if: startsWith(github.ref, 'refs/tags/') && contains(github.ref_name, '-rc')
        run: |
          TAG="${GITHUB_REF#refs/tags/v}"
          PEP440_VERSION=$(echo "$TAG" | sed 's/-rc/rc/')
          sed -i '' "s/^version = .*/version = \"${PEP440_VERSION}\"/" python/pyproject.toml

      - name: Setup Rust toolchain
        run: |
          rustup update stable
          rustup default stable

      - name: Build native library
        run: cargo build --release -p paimon-ftindex-ffi

      - name: Copy native library into package
        run: cp target/release/${{ matrix.lib_name }} python/paimon_ftindex/

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install build tools
        run: pip install build wheel setuptools delocate

      - name: Build wheel
        working-directory: python
        env:
          _PYTHON_HOST_PLATFORM: macosx-11.0-arm64
          ARCHFLAGS: "-arch arm64"
          MACOSX_DEPLOYMENT_TARGET: "11.0"
        run: python -m build --wheel

      - name: Repair wheel
        run: |
          delocate-wheel --require-archs arm64 -w python/dist/repaired python/dist/*.whl
          rm python/dist/*.whl
          mv python/dist/repaired/*.whl python/dist/

      - name: Upload wheel
        uses: actions/upload-artifact@v5
        with:
          name: wheels-${{ matrix.os }}-${{ matrix.target }}
          path: python/dist/*.whl

  wheels-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v6

      - name: Inject RC version into pyproject.toml
        if: startsWith(github.ref, 'refs/tags/') && contains(github.ref_name, '-rc')
        shell: bash
        run: |
          TAG="${GITHUB_REF#refs/tags/v}"
          PEP440_VERSION=$(echo "$TAG" | sed 's/-rc/rc/')
          sed -i "s/^version = .*/version = \"${PEP440_VERSION}\"/" python/pyproject.toml

      - name: Setup Rust toolchain
        run: |
          rustup update stable
          rustup default stable

      - name: Build native library
        run: cargo build --release -p paimon-ftindex-ffi

      - name: Copy native library into package
        shell: bash
        run: cp target/release/paimon_ftindex_ffi.dll python/paimon_ftindex/

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install build tools
        run: pip install build wheel setuptools

      - name: Build wheel
        working-directory: python
        run: python -m build --wheel

      - name: Upload wheel
        uses: actions/upload-artifact@v5
        with:
          name: wheels-windows-x86_64
          path: python/dist/*.whl
