# TODO: run in PR/test mode (larger matrix) vs "all-in-one" artifact/packaging mode
# TODO: use dynamic matrix so PRs are multi-job and tag builds are one (consolidate artifacts)
# TODO: consider secure credential storage for inline upload on tags? Or keep that all manual/OOB for security...
# TODO: refactor libyaml/pyyaml tests to enable first-class output for AppVeyor
# TODO: get version number from setup.py and/or lib(3)/__version__
# Update-AppveyorBuild -Version $dynamic_version

Function Invoke-Exe([scriptblock]$sb) {
    & $sb
    $exitcode = $LASTEXITCODE
    If($exitcode -ne 0) {
       throw "exe failed with nonzero exit code $exitcode"
    }
}

Function Bootstrap() {

    # ensure python 3.9 is present (current Appveyor VS2015 image doesn't include it)
    If(-not $(Test-Path C:\Python39)) {
        Invoke-Exe { choco.exe install python3 --version=3.9.1 -i --forcex86 --force --params="/InstallDir:C:\Python39" --no-progress }
    }

    If(-not $(Test-Path C:\Python39-x64)) {
        Invoke-Exe { choco.exe install python3 --version=3.9.1 -i --force --params="/InstallDir:C:\Python39-x64" --no-progress }
    }

    Write-Output "patching Windows SDK bits for distutils"

    # patch 7.0/7.1 vcvars SDK bits up to work with distutils query
    Set-Content -Path 'C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat' '@CALL "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat"'
    Set-Content -Path 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat' '@CALL "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /Release /x64'

    # patch VS9 x64 CMake config for VS Express, hide `reg.exe` stderr noise
    Invoke-Exe { $noise = reg.exe import packaging\build\FixVS9CMake.reg 2>&1 }

    Copy-Item -Path "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\AMD64.VCPlatform.config" -Destination "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\AMD64.VCPlatform.Express.config" -Force
    Copy-Item -Path "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\Itanium.VCPlatform.config" -Destination "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\Itanium.VCPlatform.Express.config" -Force

    # git spews all over stderr unless we tell it not to
    $env:GIT_REDIRECT_STDERR="2>&1"; 

    $libyaml_repo_url = If($env:libyaml_repo_url) { $env:libyaml_repo_url } Else { "https://github.com/yaml/libyaml.git" }
    $libyaml_refspec = If($env:libyaml_refspec) { $env:libyaml_refspec } Else { "master" }
    
    Write-Output "cloning libyaml from $libyaml_repo_url / $libyaml_refspec"

    If(-not $(Test-Path .\libyaml)) {
        Invoke-Exe { git clone -b $libyaml_refspec $libyaml_repo_url 2>&1 }
    }
}

Function Build-Wheel($python_path) {

    #$python_path = Join-Path C:\ $env:PYTHON_VER
    $python = Join-Path $python_path python.exe

    Write-Output "building pyyaml wheel for $python_path"

    # query distutils for the VC version used to build this Python; translate to a VS version to choose the right generator
    $python_vs_buildver = Invoke-Exe { & $python -c "from distutils.version import LooseVersion; from distutils.msvc9compiler import get_build_version; print(LooseVersion(str(get_build_version())).version[0])" }

    $python_cmake_generator = switch($python_vs_buildver) {
        "9" { "Visual Studio 9 2008" }
        "10" { "Visual Studio 10 2010" }
        "14" { "Visual Studio 14 2015" }
        default { throw "Python was built with unknown VS build version: $python_vs_buildver" }
    }

    # query arch this python was built for
    $python_arch = Invoke-Exe { & $python -c "from distutils.util import get_platform; print(str(get_platform()))" }

    if($python_arch -eq 'win-amd64') {
        $python_cmake_generator += " Win64"
        $vcvars_arch = "x64"
    }

    # snarf VS vars (paths, etc) for the matching VS version and arch that built this Python
    $raw_vars_out = Invoke-Exe { cmd.exe /c "`"C:\Program Files (x86)\Microsoft Visual Studio $($python_vs_buildver).0\VC\vcvarsall.bat`" $vcvars_arch & set" }
    foreach($kv in $raw_vars_out) {
        If($kv -match "=") {
            $kv = $kv.Split("=", 2)
            Set-Item -Force "env:$kv[0]" $kv[1]
        }
        Else {
            Write-Output $kv
        }
    }

    # ensure pip is current (some appveyor pips are not)
    Invoke-Exe { & $python -W "ignore:DEPRECATION" -m pip install --upgrade pip }

    # ensure required-for-build packages are present and up-to-date
    Invoke-Exe { & $python -W "ignore:DEPRECATION" -m pip install --upgrade cython wheel setuptools --no-warn-script-location }

    pushd libyaml
    Invoke-Exe { git clean -fdx }
    popd

    mkdir libyaml\build

    pushd libyaml\build
    Invoke-Exe { cmake.exe -G $python_cmake_generator -DYAML_STATIC_LIB_NAME=yaml .. }
    Invoke-Exe { cmake.exe --build . --config Release }
    popd

    Invoke-Exe { & $python setup.py --with-libyaml build_ext -I libyaml\include -L libyaml\build\Release -D YAML_DECLARE_STATIC build test bdist_wheel }
}

Function Upload-Artifacts() {
    Write-Output "uploading artifacts..."

    foreach($wheel in @(Resolve-Path dist\*.whl)) {
        Push-AppveyorArtifact $wheel
    }
}

Bootstrap

$pythons = @(
"C:\Python27"
"C:\Python27-x64"
"C:\Python36"
"C:\Python36-x64"
"C:\Python37"
"C:\Python37-x64"
"C:\Python38"
"C:\Python38-x64"
"C:\Python39"
"C:\Python39-x64"
)

#$pythons = @("C:\$($env:PYTHON_VER)")

foreach($python in $pythons) {
    Build-Wheel $python
}

Upload-Artifacts
