# 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: Configure Docker data-root
        shell: powershell
        run: |
          # The D: drive on windows-2022 GH Actions runners has ~44GB free vs ~14GB on C:.
          # Moving Docker's data-root to D: prevents hcsshim::ImportLayer failures when
          # building large Windows container layers (e.g. the vcpkg install layer). GH-49676
          Stop-Service docker
          $daemonJson = "C:\ProgramData\Docker\config\daemon.json"
          New-Item -ItemType Directory -Force -Path (Split-Path $daemonJson) | Out-Null
          if (Test-Path $daemonJson) {
            $json = Get-Content $daemonJson | ConvertFrom-Json
            $json | Add-Member -Force -NotePropertyName "data-root" -NotePropertyValue "D:\docker"
            $json | ConvertTo-Json -Depth 10 | Set-Content $daemonJson
          } else {
            Set-Content $daemonJson -Value '{"data-root":"D:\docker"}'
          }
          Start-Service docker
          Write-Host "=== daemon.json ==="
          Get-Content $daemonJson
          Write-Host "=== docker info ==="
          docker info

      - 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 %}
