<#
.SYNOPSIS
  安装 VB-Cable 虚拟声卡（VB-Audio Software）。
.DESCRIPTION
  VB-Cable 是 VB-Audio Software 提供的免费虚拟音频驱动，
  单独许可：本脚本不会内置其二进制，而是按用户许可从官网下载后静默安装。
  若 %~dp0redist\ 目录中已放置 VBCABLE 安装包（用户自行下载），
  脚本会优先使用本地副本。
.PARAMETER Local
  强制使用本地副本（installer/redist/ 目录）。
.PARAMETER Force
  即使已检测到 CABLE 设备也重新安装。
#>
[CmdletBinding()]
param(
    [switch]$Local,
    [switch]$Force
)

$ErrorActionPreference = 'Stop'

# 兼容 Windows PowerShell 5.1 `-File` 模式下 $PSScriptRoot 为空的情况
$scriptRoot = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $PSCommandPath }
$redistDir = Join-Path $scriptRoot 'redist'
$tempExe   = Join-Path $env:TEMP 'VBCABLE_Setup.exe'

# -------- 检测是否已安装 --------
$cableInstalled = $false
try {
    $cableInstalled = [bool](Get-CimInstance Win32_SoundDevice -ErrorAction SilentlyContinue |
        Where-Object { $_.Name -match 'CABLE Input|CABLE Output' })
} catch { }

if ($cableInstalled -and -not $Force) {
    Write-Output "[VB-Cable] 已检测到 CABLE 设备，跳过安装。"
    exit 0
}

# -------- 优先使用本地副本 --------
$localExe = $null
if (Test-Path $redistDir) {
    $candidates = Get-ChildItem -Path $redistDir -Filter *.exe -ErrorAction SilentlyContinue
    $localExe = $candidates | Select-Object -First 1
}

if ($Local -or $localExe) {
    if (-not $localExe) {
        Write-Error "[VB-Cable] 强制要求本地安装，但 $redistDir 中找不到 .exe。请从 vb-audio.com 下载后放入该目录。"
        exit 1
    }
    Write-Output "[VB-Cable] 使用本地安装包：$($localExe.FullName)"
    $exePath = $localExe.FullName
} else {
    # -------- 联网下载 --------
    # VB-Audio Software 官方下载地址（DonationWare 许可，个人非商业免费使用）
    $url = 'https://download.vb-audio.com/Download-CABLE/VBCABLE_Setup64.exe'
    Write-Output "[VB-Cable] 从官方地址下载：$url"
    try {
        [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
        Invoke-WebRequest -Uri $url -OutFile $tempExe -UseBasicParsing -TimeoutSec 120
    } catch {
        Write-Error "[VB-Cable] 下载失败：$_"
        exit 1
    }
    $exePath = $tempExe
}

# -------- 静默安装（NSIS /S 标志） --------
Write-Output "[VB-Cable] 正在静默安装 ..."
$proc = Start-Process -FilePath $exePath -ArgumentList '/S' -Wait -PassThru
if ($proc.ExitCode -eq 0 -or $proc.ExitCode -eq 3010) {
    Write-Output "[VB-Cable] 安装完成 ✓"
    if ($exePath -eq $tempExe) { Remove-Item $tempExe -ErrorAction SilentlyContinue }
    exit 0
} else {
    Write-Warning "[VB-Cable] 安装程序退出码 $($proc.ExitCode)，可能需要重启系统完成安装。"
    if ($exePath -eq $tempExe) { Remove-Item $tempExe -ErrorAction SilentlyContinue }
    exit $proc.ExitCode
}