modules/core/Test-Prerequisites.ps1

param(
    [string]$FrontendMode,   # "ReactTS" | "ReactJS" | "NextJS"
    [string]$Language = 'tr'
)

$ModulesDir = Split-Path -Parent $MyInvocation.MyCommand.Path
. "$ModulesDir\Utils.ps1"
. "$ModulesDir\Get-Locale.ps1"
$L = Get-Locale -Language $Language

$ManifestPath = Join-Path (Split-Path $ModulesDir) "generator.manifest.json"

function Test-Cmd($cmd) {
    $null -ne (Get-Command $cmd -ErrorAction SilentlyContinue)
}

function Refresh-Path {
    $machine = [System.Environment]::GetEnvironmentVariable("PATH", "Machine")
    $user    = [System.Environment]::GetEnvironmentVariable("PATH", "User")
    $env:PATH = "$machine;$user"
}

function Install-WithWinget($packageId, $displayName) {
    if (-not (Test-Cmd "winget")) {
        Write-Err ($L.prereqWingetMissing -f $displayName) "E007"
        exit 1
    }
    Write-Warn ($L.prereqInstalling -f $displayName)
    winget install $packageId --silent --accept-source-agreements --accept-package-agreements 2>&1 | Out-Null
    Refresh-Path
}

if ($script:PrereqChecked) { return }

$Global:PrereqVersions = @{
    Dotnet = ""
    Node   = ""
    Npm    = ""
    Docker = ""
}

Write-Host ""
Write-Host $L.prereqChecking -ForegroundColor White
Write-Host "----------------------------------------------" -ForegroundColor DarkGray

# --- .NET SDK --------------------------------------------
if (Test-Cmd "dotnet") {
    $v = dotnet --version 2>&1
    $Global:PrereqVersions.Dotnet = $v
    
    $minDotnet = Get-MinVer "minDotnetVersion" "10.0"
    if ([version]$v -lt [version]$minDotnet) {
        Write-Err ($L.prereqDotnetLow -f $minDotnet, $v) "E004"
        exit 1
    }
    Write-Ok ".NET SDK : $v"
} else {
    Install-WithWinget "Microsoft.DotNet.SDK.8" ".NET SDK 8"
    Refresh-Path
    if (Test-Cmd "dotnet") {
        $v = dotnet --version 2>&1
        $Global:PrereqVersions.Dotnet = $v
        Write-Ok ".NET SDK : $v$($L.prereqFreshInstall)"
    } else {
        Write-Err $L.prereqDotnetMissing
        exit 1
    }
}

# --- Node.js + npm (sadece frontend icin) ----------------
$needsNode = $FrontendMode -in @("ReactTS","ReactJS","NextJS")

if ($needsNode) {
    if (Test-Cmd "node") {
        $nodeV = (node --version 2>&1).Trim().TrimStart('v')
        $npmV  = npm  --version 2>&1
        $Global:PrereqVersions.Node = "v$nodeV"
        $Global:PrereqVersions.Npm  = $npmV

        $minNode = Get-MinVer "minNodeVersion" "18.0"
        if ([version]$nodeV -lt [version]$minNode) {
            Write-Err ($L.prereqNodeLow -f $minNode, $nodeV) "E005"
            exit 1
        }
        Write-Ok "Node.js : v$nodeV"
        Write-Ok "npm : $npmV"
    } else {
        Install-WithWinget "OpenJS.NodeJS.LTS" "Node.js LTS"
        Refresh-Path
        if (Test-Cmd "node") {
            $nodeV = node --version 2>&1
            $npmV  = npm  --version 2>&1
            $Global:PrereqVersions.Node = $nodeV
            $Global:PrereqVersions.Npm  = $npmV
            Write-Ok "Node.js : $nodeV$($L.prereqFreshInstall)"
            Write-Ok "npm : $npmV"
        } else {
            Write-Err $L.prereqNodeMissing
            exit 1
        }
    }
}

# --- Docker (opsiyonel) -----------------------------------
if (Test-Cmd "docker") {
    $dockerV = docker --version 2>&1
    $Global:PrereqVersions.Docker = $dockerV
    Write-Ok "Docker : $dockerV"
} else {
    Write-Warn $L.prereqDockerMissing
    Write-Warn $L.prereqDockerUrl
}

Write-Host "----------------------------------------------" -ForegroundColor DarkGray
Write-Host ""

$script:PrereqChecked = $true