# 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: arm64/v8
      {% 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.11' && '{{ 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 %}
