$venvdir = "$($env:LocalAppData)\venv"
& python -m ensurepip
& python -m pip install virtualenv
& python -m virtualenv $venvdir
& "$venvdir\scripts\activate.ps1"
$python = "$venvdir\scripts\python.exe"
& $python -m pip install --upgrade pip setuptools
& $python -m pip install -r .github\requirements.txt
& $python -m pip list --format=freeze

& choco install -y --no-progress html-tidy
Get-ChildItem -Path "$($env:ProgramData)\chocolatey\lib\html-tidy\tools" `
              -Filter '*.dll' -Recurse `
| Copy-Item -Destination "$venvdir\scripts" -Verbose

$LocalAppData = $env:LocalAppData
$venvdir = "$LocalAppData\venv"

switch -Exact ($env:MATRIX_TRACDB) {
    '' {
        $tracdb_uri = ''
    }
    'sqlite' {
        $tracdb_uri = 'sqlite:db/trac.db'
    }
    'postgresql' {
        $service = Get-Service -Name "postgresql-x64-*"
        $service | Set-Service -StartupType Manual
        $service | Start-Service
        $env:PATH = "$($env:PGBIN);$($env:PATH)"
        $env:PGPASSWORD = 'root'
        & psql -U postgres -c "CREATE USER tracuser NOSUPERUSER NOCREATEDB CREATEROLE PASSWORD 'password'"
        & createdb -U postgres -O tracuser trac
        $tracdb_uri = 'postgres://tracuser:password@localhost/trac?schema=tractest'
        Copy-Item -Path "$($env:PGBIN)\lib*.dll" `
                  -Destination "$venvdir\lib\site-packages\psycopg2" `
                  -Verbose
    }
    'mysql' {
        & choco install -y --no-progress mysql
        & mysql -u root -v -e "CREATE DATABASE trac DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"
        & mysql -u root -v -e "CREATE USER tracuser@localhost IDENTIFIED BY 'password'"
        & mysql -u root -v -e "GRANT ALL ON trac.* TO tracuser@localhost; FLUSH PRIVILEGES"
        $tracdb_uri = 'mysql://tracuser:password@localhost/trac?charset=utf8mb4'
    }
}

$env:PYTHONWARNINGS = 'default'
Set-Content -Path Makefile.cfg ".uri = $tracdb_uri"
& make.exe status Trac.egg-info compile
if ($LASTEXITCODE) {
    Write-Error "'make.exe status Trac.egg-info compile' exited with $LASTEXITCODE"
    exit 1
}
$rc = 0
& make.exe unit-test
if ($LASTEXITCODE) {
    Write-Warning "'make.exe unit-test' exited with $LASTEXITCODE"
    $rc = 1
}
if ($env:MATRIX_TESTS -eq 'functional') {
    $env:PYTHONWARNINGS = 'ignore'
    & make.exe functional-test testopts=-v
    if ($LASTEXITCODE) {
        Write-Warning "'make.exe functional-test testopts=-v' exited with $LASTEXITCODE"
        $rc = 1
    }
}
exit $rc
