[CmdletBinding()]
param()

$ErrorActionPreference = 'Stop'

$projectDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$ffmpeg = Join-Path $projectDir 'ThirdParty\ffmpeg.exe'
$ffprobe = Join-Path $projectDir 'ThirdParty\ffprobe.exe'

if (-not (Test-Path $ffmpeg) -or -not (Test-Path $ffprobe)) {
    throw 'Add ffmpeg.exe and ffprobe.exe to ThirdParty before publishing.'
}

$projectPath = Join-Path $projectDir 'AmiReel.csproj'
$releaseDir = Join-Path $projectDir 'bin\Release\net10.0-windows10.0.26100.0\win-x64'
$releaseExe = Join-Path $releaseDir 'AmiReel.exe'
$publishDir = Join-Path $releaseDir 'publish'
$publishExe = Join-Path $publishDir 'AmiReel.exe'
$publishArguments = @(
    'publish', $projectPath,
    '-c', 'Release',
    '-r', 'win-x64',
    '--self-contained', 'true',
    '-p:WindowsPackageType=None',
    '-p:PublishSingleFile=true',
    '-p:IncludeNativeLibrariesForSelfExtract=true',
    '-p:EnableCompressionInSingleFile=true'
)

if ((Test-Path $releaseExe) -or (Test-Path $publishExe)) {
    $runningReleaseInstances = Get-Process | Where-Object {
        $_.Path -and (
            [string]::Equals($_.Path, $releaseExe, [System.StringComparison]::OrdinalIgnoreCase) -or
            [string]::Equals($_.Path, $publishExe, [System.StringComparison]::OrdinalIgnoreCase)
        )
    }

    if ($runningReleaseInstances) {
        Write-Host 'Stopping running AmiReel build before publish...' -ForegroundColor Yellow
        $runningReleaseInstances | Stop-Process -Force
        Start-Sleep -Milliseconds 800
    }
}

if (Test-Path $publishDir) {
    Remove-Item -LiteralPath $publishDir -Recurse -Force -ErrorAction SilentlyContinue
}

& dotnet @publishArguments

Write-Host "Published AmiReel to $publishDir" -ForegroundColor Green
Write-Host "Release folder: $publishDir" -ForegroundColor Cyan
Write-Host "Executable: $publishExe" -ForegroundColor Cyan
