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

{% import 'macros.jinja' as macros with context %}

{{ macros.github_header() }}

permissions:
  packages: write

jobs:
  build:
    name: "Build wheel for {{ linux_wheel_kind }} {{ linux_wheel_version }}"
    {% if arch == "amd64" %}
    runs-on: ubuntu-latest
    {% else %}
    runs-on: ubuntu-24.04-arm
    {% endif %}
    env:
      {% if linux_wheel_kind == "musllinux" %}
      ALPINE_LINUX: "3.22"
      {% endif %}
      # archery uses these environment variables
      {% if arch == "amd64" %}
      ARCH: amd64
      {% else %}
      ARCH: arm64v8
      {% endif %}
      PYTHON: "{{ python_version }}"
      PYTHON_ABI_TAG: "{{ python_abi_tag }}"
      PYTHON_IMAGE_TAG: "{{ python_version }}"

    steps:
      {{ macros.github_checkout_arrow()|indent }}
      {{ macros.github_free_space()|indent }}
      {{ macros.github_install_archery()|indent }}
      {{ macros.github_login_dockerhub()|indent }}

      # Detect free-threaded Python builds
      - name: Prepare
        run: |
          if [[ "${PYTHON_ABI_TAG}" == *t ]]; then
            test_image_prefix=python-free-threaded
          else
            test_image_prefix=python
          fi
          echo "TEST_IMAGE_PREFIX=${test_image_prefix}" >> ${GITHUB_ENV}

      - name: Build wheel
        shell: bash
        env:
          GITHUB_TOKEN: {{ '${{ secrets.GITHUB_TOKEN }}' }}
        run: |
          if [ "{{ linux_wheel_kind }}" = "musllinux" ] && [ "{{ arch }}" = "arm64" ]; then
            # We can't use NuGet on musl arm systems because the official NuGet binary for arm doesn't exist.
            :
          else
            export VCPKG_BINARY_SOURCES="clear;nuget,GitHub,readwrite"
          fi
          archery docker run \
            -e SETUPTOOLS_SCM_PRETEND_VERSION={{ arrow.no_rc_version }} \
            python-wheel-{{ linux_wheel_kind }}-{{ linux_wheel_version }}

      - uses: actions/upload-artifact@v4
        with:
          name: wheel
          path: arrow/python/repaired_wheels/*.whl

      # TODO(kszucs): auditwheel show
      - name: Test wheel
        shell: bash
        run: |
          source arrow/ci/scripts/util_enable_core_dumps.sh
          archery docker run ${TEST_IMAGE_PREFIX}-wheel-{{ linux_wheel_kind }}-test-imports
          archery docker run ${TEST_IMAGE_PREFIX}-wheel-{{ linux_wheel_kind }}-test-unittests

      - name: Test wheel on AlmaLinux 8
        shell: bash
        if: |
          '{{ python_version }}' == '3.12' && '{{ linux_wheel_kind }}' == 'manylinux'
        env:
          ALMALINUX: "8"
        run: |
          archery docker run \
            -e ARROW_GANDIVA=OFF \
            -e TEST_DEFAULT=0 \
            -e TEST_PYARROW_VERSION={{ arrow.no_rc_version }} \
            -e TEST_PYTHON_VERSIONS={{ python_version }} \
            -e TEST_WHEEL_PLATFORM_TAGS={{ wheel_platform_tag }} \
            -e TEST_WHEELS=1 \
            almalinux-verify-rc

      - name: Test wheel on Ubuntu 22.04
        shell: bash
        if: |
          '{{ python_version }}' == '3.10' && '{{ linux_wheel_kind }}' == 'manylinux'
        env:
          UBUNTU: "22.04"
        run: |
          archery docker run \
            -e TEST_DEFAULT=0 \
            -e TEST_PYARROW_VERSION={{ arrow.no_rc_version }} \
            -e TEST_PYTHON_VERSIONS={{ python_version }} \
            -e TEST_WHEEL_PLATFORM_TAGS={{ wheel_platform_tag }} \
            -e TEST_WHEELS=1 \
            ubuntu-verify-rc

      - name: Test wheel on Ubuntu 24.04
        shell: bash
        if: |
          '{{ python_version }}' == '3.12' && '{{ linux_wheel_kind }}' == 'manylinux'
        env:
          UBUNTU: "24.04"
        run: |
          archery docker run \
            -e TEST_DEFAULT=0 \
            -e TEST_PYARROW_VERSION={{ arrow.no_rc_version }} \
            -e TEST_PYTHON_VERSIONS={{ python_version }} \
            -e TEST_WHEEL_PLATFORM_TAGS={{ wheel_platform_tag }} \
            -e TEST_WHEELS=1 \
            ubuntu-verify-rc

      {{ macros.github_upload_releases("arrow/python/repaired_wheels/*.whl")|indent }}
      {{ macros.github_upload_wheel_scientific_python("arrow/python/repaired_wheels/*.whl")|indent }}

      {% if arrow.is_default_branch() %}
      - name: Push Docker images
        shell: bash
        run: |
          archery docker push python-wheel-{{ linux_wheel_kind }}-{{ linux_wheel_version }}
          archery docker push ${TEST_IMAGE_PREFIX}-wheel-{{ linux_wheel_kind }}-test-unittests
      {% endif %}
