# Opens a PowerShell instance with elevation, finds the wsl ip without relying on hostname, since ArchWSL and others doesn't have it
# then iterate opening the selected ports
$principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if($principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    	$remoteport = wsl -- ip -o -4 -json addr list eth0 ` | ConvertFrom-Json ` | %{ $_.addr_info.local } ` | ?{ $_ }
	$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

	if($found) {
	  $remoteport = $matches[0];
	} else{
	  echo "The Script Exited, the ip address of WSL 2 cannot be found";
	  exit;
	}

	#[Ports]
	#All the ports you want to forward separated by coma
	$ports=@(80,443,3000,3333,5000,8081,10000,19000,19001);


	#[Static ip]
	#You can change the addr to your ip config to listen to a specific address
	$addr='0.0.0.0';
	$ports_a = $ports -join ",";


	#Remove Firewall Exception Rules
	iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

	#adding Exception Rules for inbound and outbound Rules
	iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
	iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

	for($i = 0; $i -lt $ports.length; $i++){
	  $port = $ports[$i];
	  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
	  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
	}
}
else {
    Start-Process -FilePath "powershell" -ArgumentList "$('-File ""')$(Get-Location)$('\')$($MyInvocation.MyCommand.Name)$('""')" -Verb runAs
}