#!/usr/bin/env pwsh

function global:Build-Transmission(
    [string] $PrefixDir,
    [string] $Arch,
    [string] $DepsPrefixDir,
    [string] $SourceDir,
    [string] $ArtifactsDir,
    [string] $UseQtVersion,
    [boolean] $PackDebugSyms
) {
    $BuildDir = Join-Path $SourceDir .build

    $env:PATH = @(
        (Join-Path $DepsPrefixDir bin)
        $env:PATH
    ) -join [System.IO.Path]::PathSeparator

    $ConfigOptions = @(
        '-DCMAKE_BUILD_TYPE=RelWithDebInfo'
        "-DCMAKE_INSTALL_PREFIX=${PrefixDir}"
        "-DCMAKE_PREFIX_PATH=${DepsPrefixDir}"
        "-DTR_THIRD_PARTY_DIR:PATH=${PrefixDir}"
        "-DTR_QT_DIR:PATH=${PrefixDir}"
        '-DRUN_CLANG_TIDY=OFF'
    )

    Invoke-CMakeBuildAndInstall $SourceDir $BuildDir $ConfigOptions

    $DebugSymbolsDir = Join-Path $BuildDir dbg
    New-Item -Path $DebugSymbolsDir -ItemType Directory -ErrorAction Ignore | Out-Null

    foreach ($x in @('remote', 'create', 'edit', 'show', 'daemon', 'qt')) {
        # Copy-Item -Path (Join-Path $PrefixDir bin "transmission-${x}.exe") -Destination (Join-Path $PrefixDir bin)
        Get-ChildItem -Path $BuildDir -Filter "transmission-${x}.pdb" -Recurse | `
            Select-Object -First 1 | `
            ForEach-Object { Copy-Item -Path $_.FullName -Destination $DebugSymbolsDir }
    }

    $OpenSslLibSuffix = if ($Arch -eq 'x86') { '' } else { '-x64' }
    foreach ($x in @('libcurl', "libcrypto-3${OpenSslLibSuffix}", "libssl-3${OpenSslLibSuffix}", 'zlib', 'dbus-1')) {
        if ($DepsPrefixDir -ne $PrefixDir) {
            Copy-Item -Path (Join-Path $DepsPrefixDir bin "${x}.dll") -Destination (Join-Path $PrefixDir bin)
        }
        Copy-Item -Path (Join-Path $DepsPrefixDir bin "${x}.pdb") -Destination $DebugSymbolsDir
    }

    $QtModules = @('Core', 'DBus', 'Gui', 'Network', 'Svg', 'Widgets')
    if ($UseQtVersion -eq '5') {
        $QtModules += @('WinExtras')
    }

    foreach ($x in $QtModules) {
        if ($DepsPrefixDir -ne $PrefixDir) {
            Copy-Item -Path (Join-Path $DepsPrefixDir bin "Qt${UseQtVersion}${x}.dll") -Destination (Join-Path $PrefixDir bin)
        }
        Copy-Item -Path (Join-Path $DepsPrefixDir bin "Qt${UseQtVersion}${x}.pdb") -Destination $DebugSymbolsDir
    }

    foreach ($x in @('gif', 'ico', 'jpeg', 'svg')) {
        if ($DepsPrefixDir -ne $PrefixDir) {
            New-Item -Path (Join-Path $PrefixDir plugins imageformats) -ItemType Directory -ErrorAction Ignore | Out-Null
            Copy-Item -Path (Join-Path $DepsPrefixDir plugins imageformats "q${x}.dll") -Destination (Join-Path $PrefixDir plugins imageformats)
        }
        Copy-Item -Path (Join-Path $DepsPrefixDir plugins imageformats "q${x}.pdb") -Destination $DebugSymbolsDir
    }

    if ($UseQtVersion -eq '6') {
        foreach ($x in @('openssl')) {
            if ($DepsPrefixDir -ne $PrefixDir) {
                New-Item -Path (Join-Path $PrefixDir plugins tls) -ItemType Directory -ErrorAction Ignore | Out-Null
                Copy-Item -Path (Join-Path $DepsPrefixDir plugins tls "q${x}backend.dll") -Destination (Join-Path $PrefixDir plugins tls)
            }
            Copy-Item -Path (Join-Path $DepsPrefixDir plugins tls "q${x}backend.pdb") -Destination $DebugSymbolsDir
        }
    }

    if ($DepsPrefixDir -ne $PrefixDir) {
        New-Item -Path (Join-Path $PrefixDir plugins platforms) -ItemType Directory -ErrorAction Ignore | Out-Null
        Copy-Item -Path (Join-Path $DepsPrefixDir plugins platforms qwindows.dll) -Destination (Join-Path $PrefixDir plugins platforms)
    }
    Copy-Item -Path (Join-Path $DepsPrefixDir plugins platforms qwindows.pdb) -Destination $DebugSymbolsDir

    $QtStyle = if ($UseQtVersion -eq '5') { 'windowsvista' } else { 'modernwindows' }
    if ($DepsPrefixDir -ne $PrefixDir) {
        New-Item -Path (Join-Path $PrefixDir plugins styles) -ItemType Directory -ErrorAction Ignore | Out-Null
        Copy-Item -Path (Join-Path $DepsPrefixDir plugins styles "q${QtStyle}style.dll") -Destination (Join-Path $PrefixDir plugins styles)
    }
    Copy-Item -Path (Join-Path $DepsPrefixDir plugins styles "q${QtStyle}style.pdb") -Destination $DebugSymbolsDir

    if ($DepsPrefixDir -ne $PrefixDir) {
        Copy-Item -Path (Join-Path $DepsPrefixDir translations) -Destination $PrefixDir -Recurse
    }

    Invoke-VcEnvCommand cmake --build $BuildDir --target pack-msi

    New-Item -Path $ArtifactsDir -ItemType Directory -ErrorAction Ignore | Out-Null
    $MsiPackage = (Get-ChildItem (Join-Path $BuildDir dist msi 'transmission-*.msi'))[0]
    Move-Item -Path $MsiPackage.FullName -Destination $ArtifactsDir

    if ($PackDebugSyms) {
        Invoke-NativeCommand cmake -E chdir $DebugSymbolsDir 7z a -y (Join-Path $ArtifactsDir "$($MsiPackage.BaseName)-pdb.7z")
    }
}

function global:Test-Transmission([string] $DepsPrefixDir, [string] $SourceDir) {
    $BuildDir = Join-Path $SourceDir .build

    $env:PATH = @(
        (Join-Path $DepsPrefixDir bin)
        $env:PATH
    ) -join [System.IO.Path]::PathSeparator

    try {
        Invoke-VcEnvCommand cmake -E chdir $BuildDir ctest -T Test --output-on-failure
    } finally {
        Publish-CTestResults (Join-Path $BuildDir Testing '*' Test.xml)
    }
}
