# Standalone VPN connection script - copy this to any machine
# No dependencies, includes everything needed

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

Write-Host "=== PST VPN Connection ===" -ForegroundColor Cyan

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

if ($LASTEXITCODE -ne 0 -and $result -notlike "*Already connected*") {
    Write-Host "[ERROR] Connection failed: $result" -ForegroundColor Red
    exit 1
}

Write-Host "[OK] Connected to VPN" -ForegroundColor Green

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

# Find VPN interface
Write-Host "`n[2/3] Configuring DNS and routes..." -ForegroundColor Yellow

# Show all active interfaces for debugging
Write-Host "Active network interfaces:" -ForegroundColor Gray
Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | ForEach-Object {
    Write-Host "  - $($_.Name): $($_.InterfaceDescription)" -ForegroundColor DarkGray
}

# Try to find VPN interface - L2TP creates a PPP adapter with the connection name
$vpnInterface = $null

# Method 1: Look for exact match on connection name (most reliable)
$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 ($vpnInterface) {
    Write-Host "Found VPN interface by connection name" -ForegroundColor Gray
}

# Method 2: Look for PPP adapter (L2TP uses PPP)
if (-not $vpnInterface) {
    Write-Host "Trying PPP adapter pattern..." -ForegroundColor Gray
    $vpnInterface = Get-NetAdapter | Where-Object {
        $_.InterfaceDescription -like "*PPP*" -and $_.Status -eq "Up"
    } | Select-Object -First 1
}

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

if ($vpnInterface) {
    Write-Host "Using interface: $($vpnInterface.Name) (Index: $($vpnInterface.InterfaceIndex))" -ForegroundColor Green
    Write-Host "  Description: $($vpnInterface.InterfaceDescription)" -ForegroundColor Gray

    # Set DNS
    try {
        Set-DnsClientServerAddress -InterfaceIndex $vpnInterface.InterfaceIndex -ServerAddresses $dnsServer -ErrorAction Stop
        Write-Host "[OK] DNS set to $dnsServer" -ForegroundColor Green
    }
    catch {
        Write-Host "[WARNING] Could not set DNS: $_" -ForegroundColor Yellow
    }

    # Add route
    try {
        Write-Host "Adding route for $remoteNetwork..." -ForegroundColor Gray

        # Delete existing route
        cmd /c "route delete $remoteNetwork" 2>&1 | Out-Null

        # Add new route
        $routeResult = cmd /c "route add $remoteNetwork mask $subnetMask 0.0.0.0 if $($vpnInterface.InterfaceIndex) metric 1" 2>&1

        if ($LASTEXITCODE -eq 0) {
            Write-Host "[OK] Route added for $remoteNetwork/24" -ForegroundColor Green
        }
        else {
            Write-Host "[WARNING] Route add returned: $routeResult" -ForegroundColor Yellow
        }
    }
    catch {
        Write-Host "[WARNING] Could not add route: $_" -ForegroundColor Yellow
    }
}
else {
    Write-Host "[WARNING] Could not identify VPN interface!" -ForegroundColor Yellow
    Write-Host "You may need to manually configure DNS and routes" -ForegroundColor Yellow
}

# Verify connection
Write-Host "`n[3/3] Verification..." -ForegroundColor Yellow

# Check rasdial status
$connectionStatus = rasdial
Write-Host "Connection status:" -ForegroundColor Gray
Write-Host $connectionStatus -ForegroundColor DarkGray

# Check route
$routeCheck = route print | Select-String $remoteNetwork
if ($routeCheck) {
    Write-Host "[OK] Route to $remoteNetwork exists" -ForegroundColor Green
}
else {
    Write-Host "[WARNING] Route to $remoteNetwork not found in routing table" -ForegroundColor Yellow
}

# Test connectivity
Write-Host "`nTesting connectivity to $dnsServer..." -ForegroundColor Gray
$pingResult = Test-Connection -ComputerName $dnsServer -Count 2 -Quiet

if ($pingResult) {
    Write-Host "[OK] Remote network is reachable!" -ForegroundColor Green
}
else {
    Write-Host "[WARNING] Cannot ping $dnsServer" -ForegroundColor Yellow
    Write-Host "This might be normal if ICMP is blocked" -ForegroundColor Gray
}

Write-Host "`n=== Connection Summary ===" -ForegroundColor Cyan
Write-Host "VPN: Connected" -ForegroundColor Green
Write-Host "DNS: Configured (if interface was found)" -ForegroundColor $(if ($vpnInterface) { "Green" } else { "Yellow" })
Write-Host "Route: Configured (if interface was found)" -ForegroundColor $(if ($vpnInterface) { "Green" } else { "Yellow" })
Write-Host "`nTo disconnect: rasdial `"$vpnName`" /disconnect" -ForegroundColor Gray
Write-Host ""
