# Zatrzymuje zawieszone procesy Bazy Polis:
#  - serwer node.exe (serwer.mjs / aktualizator.mjs) razem z procesami potomnymi,
#  - przegladarki Chrome automatyzacji (profile w pliki\tmp\chrome-*-profile),
#  - inny proces node.exe, ktory nadal blokuje port aplikacji (domyslnie 3210).
# Nie zamyka zwyklych okien Chrome ani zadnych innych programow.

$ErrorActionPreference = "SilentlyContinue"

$plikiDirectory = Split-Path -Parent $PSScriptRoot
$applicationPort = 3210
if ($env:BAZA_POLIS_PORT -match '^\d+$') { $applicationPort = [int]$env:BAZA_POLIS_PORT }

$stoppedCount = 0

function Stop-ProcessTree {
  param([int]$TargetProcessId, [string]$Label)
  if (-not (Get-Process -Id $TargetProcessId -ErrorAction SilentlyContinue)) { return $false }
  Write-Host ("- zatrzymywanie: {0} (PID {1})" -f $Label, $TargetProcessId)
  taskkill /PID $TargetProcessId /T /F 2>$null | Out-Null
  return $true
}

# 1) Serwer i aktualizator Bazy Polis (node.exe)
$serverProcesses = @(Get-CimInstance Win32_Process -Filter "Name = 'node.exe'" | Where-Object {
  $_.CommandLine -match 'serwer\.mjs|aktualizator\.mjs'
})
foreach ($serverProcess in $serverProcesses) {
  if (Stop-ProcessTree -TargetProcessId $serverProcess.ProcessId -Label "serwer Bazy Polis (node.exe)") { $stoppedCount++ }
}

# 2) Osierocone przegladarki automatyzacji (Chrome z profilem w pliki\tmp\chrome-*)
$automationProfilePattern = "*" + $plikiDirectory + "\tmp\chrome-*"
$automationChromeProcesses = @(Get-CimInstance Win32_Process -Filter "Name = 'chrome.exe'" | Where-Object {
  $_.CommandLine -like $automationProfilePattern
})
$aliveChromeProcesses = @($automationChromeProcesses | Where-Object {
  Get-Process -Id $_.ProcessId -ErrorAction SilentlyContinue
})
if ($aliveChromeProcesses.Count -gt 0) {
  Write-Host ("- zamykanie przegladarek automatyzacji: {0} procesow Chrome" -f $aliveChromeProcesses.Count)
  foreach ($chromeProcess in $aliveChromeProcesses) {
    taskkill /PID $chromeProcess.ProcessId /T /F 2>$null | Out-Null
  }
  $stoppedCount++
}

# 3) Cokolwiek, co nadal blokuje port aplikacji
Start-Sleep -Milliseconds 400
$portListeners = @(Get-NetTCPConnection -LocalPort $applicationPort -State Listen -ErrorAction SilentlyContinue)
foreach ($portListener in $portListeners) {
  $owningProcess = Get-Process -Id $portListener.OwningProcess -ErrorAction SilentlyContinue
  if (-not $owningProcess) { continue }
  if ($owningProcess.ProcessName -eq "node") {
    if (Stop-ProcessTree -TargetProcessId $owningProcess.Id -Label "proces node.exe blokujacy port") { $stoppedCount++ }
  } else {
    Write-Host ("UWAGA: port {0} zajmuje program {1} (PID {2}) - to nie jest Baza Polis, wiec nie zostal zatrzymany." -f $applicationPort, $owningProcess.ProcessName, $owningProcess.Id)
  }
}

# Podsumowanie
if ($stoppedCount -eq 0) {
  Write-Host "Nie znaleziono zawieszonych procesow Bazy Polis - wszystko bylo juz zamkniete."
}
$finalListener = Get-NetTCPConnection -LocalPort $applicationPort -State Listen -ErrorAction SilentlyContinue
if ($finalListener) {
  Write-Host ("Port {0} nadal jest zajety. Uruchom to narzedzie ponownie lub zrestartuj komputer." -f $applicationPort)
} else {
  Write-Host ("Port {0} jest wolny. Mozesz uruchomic Baze Polis skrotem 'Uruchom Baza Polis.cmd'." -f $applicationPort)
}
