# 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() }}
# env: is generated by macros.github_header()
  ARROW_JEMALLOC: "{{ arrow_jemalloc }}"
  CC: "clang"
  CMAKE_BUILD_TYPE: release
  CXX: "clang++"
  MACOSX_DEPLOYMENT_TARGET: "{{ macos_deployment_target }}"
  PYARROW_BUILD_VERBOSE: 1
  PYARROW_VERSION: "{{ arrow.no_rc_version }}"
  PYTHON_VERSION: "{{ python_version }}"
  PYTHON_ABI_TAG: "{{ python_abi_tag }}"
  {% if python_abi_tag.endswith('t') %}
  PYTHON: "/Library/Frameworks/PythonT.framework/Versions/{{ python_version }}/bin/python{{ python_version }}t"
  {% else %}
  PYTHON: "/Library/Frameworks/Python.framework/Versions/{{ python_version }}/bin/python{{ python_version }}"
  {% endif %}
  VCPKG_DEFAULT_TRIPLET: "{{ vcpkg_arch }}-osx-static-release"
  VCPKG_FEATURE_FLAGS: "manifests"
  VCPKG_OVERLAY_TRIPLETS: {{ "${{ github.workspace }}/arrow/ci/vcpkg" }}
  VCPKG_ROOT: {{ "${{ github.workspace }}/vcpkg" }}

permissions:
  packages: write

jobs:
  build:
    name: Build wheel for Python {{ python_version }} on macOS
    runs-on: "{{ runs_on }}"
    env:
      VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite'
    steps:
      {{ macros.github_checkout_arrow()|indent }}

      - name: Install System Dependencies
        run: |
          brew install bash bison coreutils mono ninja
          echo "$(brew --prefix bison)/bin" >> $GITHUB_PATH

      - name: Homebrew packages
        run: |
          brew list

      # CMake 3.29.1 that is pre-installed on the macOS image has a problem.
      # See also: https://github.com/microsoft/vcpkg/issues/37968
      - name: Install CMake 3.29.0
        shell: bash
        run: |
          arrow/ci/scripts/install_cmake.sh 3.29.0 ${PWD}/local
          echo "${PWD}/local/bin" >> $GITHUB_PATH

      - name: Retrieve VCPKG version from arrow/.env
        run: |
          vcpkg_version=$(. "arrow/.env" && echo "${VCPKG}")
          echo "VCPKG_VERSION=$vcpkg_version" >> $GITHUB_ENV

      - name: Install Vcpkg
        env:
          GITHUB_TOKEN: {{ '${{ secrets.GITHUB_TOKEN }}' }}
        run: arrow/ci/scripts/install_vcpkg.sh $VCPKG_ROOT $VCPKG_VERSION

      - name: Add Vcpkg to PATH
        run: echo ${VCPKG_ROOT} >> $GITHUB_PATH

      - name: Install Packages
        run: |
          vcpkg install \
            --clean-after-build \
            --x-install-root=${VCPKG_ROOT}/installed \
            --x-manifest-root=arrow/ci/vcpkg \
            --x-feature=azure \
            --x-feature=flight \
            --x-feature=gcs \
            --x-feature=json \
            --x-feature=orc \
            --x-feature=parquet \
            --x-feature=s3

      - name: Install Python {{ python_version }}
        run: sudo arrow/ci/scripts/install_python.sh macos {{ python_version + "t" if python_abi_tag.endswith('t') else python_version }}

      - name: Build Wheel
        run: |
          $PYTHON -m venv build-env
          source build-env/bin/activate
          pip install --upgrade pip wheel
          PYTHON=python arrow/ci/scripts/python_wheel_macos_build.sh {{ arch }} $(pwd)/arrow $(pwd)/build

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

      # Use a well-known Python version for the GCS testbench, and avoid
      # putting it in PATH.
      - name: Set up Python for GCS testbench
        uses: actions/setup-python@v5.1.1
        id: gcs-python-install
        with:
          python-version: 3.12
          update-environment: false

      - name: Install GCS testbench
        env:
          PIPX_BIN_DIR: /usr/local/bin
          PIPX_BASE_PYTHON: {{ '${{ steps.gcs-python-install.outputs.python-path }}' }}
        run: arrow/ci/scripts/install_gcs_testbench.sh default

      - name: Install MinIO
        run: |
          $(brew --prefix bash)/bin/bash \
            arrow/ci/scripts/install_minio.sh latest /usr/local

      - name: Test Wheel
        env:
          PYTEST_ADDOPTS: "-k 'not test_cancellation'"
          PYTHON_GIL: {{ 0 if python_abi_tag.endswith('t') else 1 }}
        run: |
          $PYTHON -m venv test-env
          source test-env/bin/activate
          pip install --upgrade pip wheel
          arch -{{ arch }} arrow/ci/scripts/python_wheel_unix_test.sh $(pwd)/arrow

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