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

name: Release Java

on:
  workflow_call:
  workflow_dispatch:

env:
  JDK_VERSION: 8

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

jobs:
  build-native:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            os_name: linux
            arch: x86_64
            lib_name: libpaimon_ftindex_jni.so
          - os: ubuntu-24.04-arm
            target: aarch64-unknown-linux-gnu
            os_name: linux
            arch: aarch64
            lib_name: libpaimon_ftindex_jni.so
          - os: macos-latest
            target: aarch64-apple-darwin
            os_name: macos
            arch: aarch64
            lib_name: libpaimon_ftindex_jni.dylib
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            os_name: windows
            arch: x86_64
            lib_name: paimon_ftindex_jni.dll
    steps:
      - uses: actions/checkout@v6

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

      - name: Setup Python
        if: matrix.os_name == 'linux'
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Setup Linux zigbuild
        if: matrix.os_name == 'linux'
        run: pip install cargo-zigbuild

      - name: Build Linux JNI library
        if: matrix.os_name == 'linux'
        shell: bash
        run: |
          set -euo pipefail

          rustup target add "${{ matrix.target }}"
          unset ZSTD_SYS_USE_PKG_CONFIG

          cargo zigbuild --release -p paimon-ftindex-jni --target "${{ matrix.target }}.2.17"

          artifact="target/${{ matrix.target }}/release/${{ matrix.lib_name }}"
          test -f "$artifact"

          version_info="$(readelf --version-info "$artifact")"
          max_glibc="$(
            printf '%s\n' "$version_info" \
              | grep -Eo 'GLIBC_[0-9][0-9.]*' \
              | sort -Vu \
              | tail -n1 \
              || true
          )"
          echo "Maximum required GLIBC version: ${max_glibc:-none}"

          if [[ -n "$max_glibc" ]]; then
            allowed_glibc="GLIBC_2.17"
            highest_glibc="$(printf '%s\n%s\n' "$allowed_glibc" "$max_glibc" | sort -Vu | tail -n1)"
            if [[ "$highest_glibc" != "$allowed_glibc" ]]; then
              echo "Linux GNU artifact requires $max_glibc, expected <= $allowed_glibc" >&2
              exit 1
            fi
          fi

      - name: Build JNI library
        if: matrix.os_name != 'linux'
        run: |
          rustup target add "${{ matrix.target }}"
          cargo build --release -p paimon-ftindex-jni --target "${{ matrix.target }}"

      - name: Upload native library
        uses: actions/upload-artifact@v5
        with:
          name: native-${{ matrix.os_name }}-${{ matrix.arch }}
          path: target/${{ matrix.target }}/release/${{ matrix.lib_name }}

  package-java:
    if: github.repository == 'apache/paimon-full-text' && startsWith(github.ref, 'refs/tags/') && contains(github.ref_name, '-rc')
    runs-on: ubuntu-latest
    needs: [build-native]
    steps:
      - uses: actions/checkout@v6

      - name: Download linux x86_64 native library
        uses: actions/download-artifact@v5
        with:
          name: native-linux-x86_64
          path: java/src/main/resources/native/linux/x86_64

      - name: Download linux aarch64 native library
        uses: actions/download-artifact@v5
        with:
          name: native-linux-aarch64
          path: java/src/main/resources/native/linux/aarch64

      - name: Download macOS aarch64 native library
        uses: actions/download-artifact@v5
        with:
          name: native-macos-aarch64
          path: java/src/main/resources/native/macos/aarch64

      - name: Download windows x86_64 native library
        uses: actions/download-artifact@v5
        with:
          name: native-windows-x86_64
          path: java/src/main/resources/native/windows/x86_64

      - name: Verify native libraries
        run: find java/src/main/resources/native -type f | sort

      - name: Set up JDK ${{ env.JDK_VERSION }}
        uses: actions/setup-java@v4
        with:
          java-version: ${{ env.JDK_VERSION }}
          distribution: 'temurin'
          cache: maven

      - name: Show Maven version
        run: mvn --version

      - name: Package Java artifact
        working-directory: java
        run: mvn clean verify -Prelease -Dgpg.skip=true -DskipTests

      - name: Upload Java package
        uses: actions/upload-artifact@v5
        with:
          name: java-package
          path: java/target/*.jar
