# Connect to PST VPN and configure DNS
# Can be run manually or by Task Scheduler

$vpnName = "PST-NW-VPN"
$username = "pst-admin"
$password = "24Hearts$"
$dnsServer = "192.168.0.2"
$remoteNetwork = "192.168.0.0"
$subnetMask = "255.255.255.0"

# Connect to VPN
Write-Host "Connecting to $vpnName..." -ForegroundColor Cyan
$result = cmd /c "rasdial `"$vpnName`" $username $password" 2>&1

if ($LASTEXITCODE -eq 0 -or $result -like "*Already connected*") {
    Write-Host "[OK] Connected to VPN" -ForegroundColor Green

    # Wait for interface to be ready
    Start-Sleep -Seconds 5

    # Configure DNS
    Write-Host "Setting DNS to $dnsServer..." -ForegroundColor Cyan

    try {
        # Find the VPN interface - L2TP creates a PPP adapter with the connection name
        $vpnInterface = Get-NetAdapter | Where-Object {
            ($_.InterfaceAlias -eq $vpnName -or
             $_.InterfaceDescription -eq $vpnName -or
             $_.Name -eq $vpnName) -and
            $_.Status -eq "Up"
        } | Select-Object -First 1

        # If not found, try PPP adapter pattern
        if (-not $vpnInterface) {
            Write-Host "Trying PPP adapter search..." -ForegroundColor Gray
            $vpnInterface = Get-NetAdapter | Where-Object {
                $_.InterfaceDescription -like "*PPP*" -and $_.Status -eq "Up"
            } | Select-Object -First 1
        }

        # Last resort: WAN Miniport
        if (-not $vpnInterface) {
            Write-Host "Trying WAN Miniport search..." -ForegroundColor Gray
            $vpnInterface = Get-NetAdapter | Where-Object {
                $_.InterfaceDescription -like "*WAN*" -and $_.Status -eq "Up"
            } | Select-Object -First 1
        }

        if ($vpnInterface) {
            Write-Host "Found VPN interface: $($vpnInterface.Name) ($($vpnInterface.InterfaceDescription))" -ForegroundColor Gray

            Set-DnsClientServerAddress -InterfaceIndex $vpnInterface.InterfaceIndex -ServerAddresses $dnsServer
            Write-Host "[OK] DNS configured: $dnsServer" -ForegroundColor Green

            # Verify DNS
            $dns = Get-DnsClientServerAddress -InterfaceIndex $vpnInterface.InterfaceIndex -AddressFamily IPv4
            Write-Host "Current DNS: $($dns.ServerAddresses -join ', ')" -ForegroundColor Gray

            # Add route for remote network (UniFi L2TP requirement)
            Write-Host "Adding route for remote network $remoteNetwork..." -ForegroundColor Cyan

            try {
                # Remove existing route if present (avoid duplicates)
                route delete $remoteNetwork 2>$null | Out-Null

                # Add persistent route through VPN interface
                $routeCmd = "route add $remoteNetwork mask $subnetMask 0.0.0.0 if $($vpnInterface.InterfaceIndex) metric 1"
                cmd /c $routeCmd 2>&1 | Out-Null

                if ($LASTEXITCODE -eq 0) {
                    Write-Host "[OK] Route added: $remoteNetwork/$subnetMask via VPN" -ForegroundColor Green
                }
                else {
                    Write-Host "[WARNING] Route command returned code $LASTEXITCODE" -ForegroundColor Yellow
                }

                # Verify route
                $routes = route print | Select-String $remoteNetwork
                if ($routes) {
                    Write-Host "Route verified in routing table" -ForegroundColor Gray
                }
            }
            catch {
                Write-Host "[WARNING] Failed to add route: $_" -ForegroundColor Yellow
                Write-Host "You may need to manually add route: route add $remoteNetwork mask $subnetMask 0.0.0.0 if $($vpnInterface.InterfaceIndex)" -ForegroundColor Yellow
            }
        }
        else {
            Write-Host "[WARNING] VPN interface not found or not active" -ForegroundColor Yellow
        }
    }
    catch {
        Write-Host "[ERROR] Failed to configure VPN: $_" -ForegroundColor Red
    }
}
else {
    Write-Host "[ERROR] Connection failed: $result" -ForegroundColor Red
    exit 1
}
