# 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 Windows"
    runs-on: windows-2022
    env:
      # archery uses this environment variable
      PYTHON: "{{ python_version }}"
      PYTHON_ABI_TAG: "{{ python_abi_tag }}"
      # this is a private repository at the moment (mostly because of licensing
      # consideration of windows images with visual studio), but anyone can
      # recreate the image by manually building it via:
      # `archery build python-wheel-windows-vs2022`
      # note that we don't run docker build since there wouldn't be a cache hit
      # and rebuilding the dependencies takes a fair amount of time
      REPO: ghcr.io/ursacomputing/arrow
      # BuildKit isn't really supported on Windows for now.
      # NuGet + GitHub Packages based vcpkg cache is also disabled for now.
      # Because secret mount requires BuildKit.
      DOCKER_BUILDKIT: 0

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

      - name: Prepare
        shell: bash
        run: |
          case "${PYTHON_ABI_TAG}" in
            *t)
              test_image_prefix=python-free-threaded
              ;;
            *)
              test_image_prefix=python
              ;;
          esac
          echo "TEST_IMAGE_PREFIX=${test_image_prefix}" >> ${GITHUB_ENV}

      - name: Build wheel
        shell: cmd
        run: |
          cd arrow
          @rem We want to use only
          @rem   archery docker run -e SETUPTOOLS_SCM_PRETEND_VERSION={{ arrow.no_rc_version }} python-wheel-windows-vs2022
          @rem but it doesn't use pulled caches.
          @rem It always build an image from scratch.
          @rem We can remove this workaround once we find a way to use
          @rem pulled caches when build an image.
          echo on
          archery docker pull --no-ignore-pull-failures %TEST_IMAGE_PREFIX%-wheel-windows-vs2022
          if errorlevel 1 (
            archery docker build --no-pull %TEST_IMAGE_PREFIX%-wheel-windows-vs2022 || exit /B 1
          )
          archery docker run --no-build -e SETUPTOOLS_SCM_PRETEND_VERSION={{ arrow.no_rc_version }} %TEST_IMAGE_PREFIX%-wheel-windows-vs2022

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

      - name: Test wheel
        shell: cmd
        run: |
          cd arrow
          archery docker pull --no-ignore-pull-failures %TEST_IMAGE_PREFIX%-wheel-windows-test
          if errorlevel 1 (
            archery docker build --no-pull %TEST_IMAGE_PREFIX%-wheel-windows-test || exit /B 1
          )
          archery docker run %TEST_IMAGE_PREFIX%-wheel-windows-test

      {{ 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 image
        shell: cmd
        run: |
          cd arrow
          archery docker push %TEST_IMAGE_PREFIX%-wheel-windows-vs2022
          archery docker push %TEST_IMAGE_PREFIX%-wheel-windows-test
      {% endif %}
