# 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() }}

jobs:
  build:
    name: "Build wheel for manylinux {{ manylinux_version }}"
    {% if arch == "amd64" %}
    runs-on: ubuntu-latest
    {% else %}
    runs-on: ["self-hosted", "Linux", "arm64"]
    {% endif %}
    env:
      # archery uses these environment variables
      {% if arch == "amd64" %}
      ARCH: amd64
      {% else %}
      ARCH: arm64v8
      {% endif %}
      PYTHON: "{{ python_version }}"

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

      - name: Build wheel
        shell: bash
        run: archery docker run -e SETUPTOOLS_SCM_PRETEND_VERSION={{ arrow.no_rc_version }} python-wheel-manylinux-{{ manylinux_version }}

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

      # TODO(kszucs): auditwheel show
      - name: Test wheel
        shell: bash
        run: |
          archery docker run python-wheel-manylinux-test-imports
          archery docker run python-wheel-manylinux-test-unittests

      - name: Test wheel on AlmaLinux 8
        shell: bash
        if: |
          '{{ python_version }}' == '3.8'
        env:
          ALMALINUX: "8"
        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 \
            almalinux-verify-rc

      - name: Test wheel on Ubuntu 20.04
        shell: bash
        if: |
          '{{ python_version }}' == '3.8'
        env:
          UBUNTU: "20.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 22.04
        shell: bash
        if: |
          '{{ python_version }}' == '3.10'
        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

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

      {% if arrow.is_default_branch() %}
      - name: Push Docker Image
        shell: bash
        run: |
          archery docker push python-wheel-manylinux-{{ manylinux_version }}
          archery docker push python-wheel-manylinux-test-unittests
      {% endif %}
