src/Interact/main.ps1

param ($Localize)

#_if PSScript
# Load localization data
. "$PSScriptRoot\..\predicate.ps1"
$LocalizeData = . "$PSScriptRoot\..\LocaleLoader.ps1" -Localize $Localize
$I18n = $LocalizeData.InteractI18nData

# Set window title for interactive mode
$OldTitle = $Host.UI.RawUI.WindowTitle
$Host.UI.RawUI.WindowTitle = "ps12exe - $($I18n.ModeName)"

try {
    # Helper function for colored, internationalized output
    function Write-I18n {
        param(
            [string]$Symbol,
            [string]$Message,
            [string]$Sequence,
            [ConsoleColor]$SymbolColor,
            [ConsoleColor]$MessageColor = 'White',
            [ConsoleColor]$SequenceColor = 'White'
        )
        Write-Host -NoNewline " "
        Write-Host -ForegroundColor $SymbolColor $Symbol -NoNewline
        Write-Host -ForegroundColor $MessageColor " $Message" -NoNewline
        Write-Host -ForegroundColor $SequenceColor " $Sequence"
    }

    Write-I18n "[*]" $I18n.Welcome -SymbolColor Cyan

    while ($true) {
        $cmdParams = [System.Collections.ArrayList]::new()

        # Input file prompt
        $inputFile = ''
        do {
            Write-I18n "[*]" $I18n.EnterInputFile -SymbolColor Green
            Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
            $inputFile = Read-Host
            if (-not $inputFile) {
                Write-I18n "[!]" $I18n.InvalidInputFile -SymbolColor Red
            }
            elseif (-not (Test-Path $inputFile -PathType Leaf)) {
                Write-I18n "[!]" $I18n.FileDoesNotExist -SymbolColor Red
                $inputFile = ''
            }
            elseif ($inputFile -notmatch "\.(ps1|psd1|tmp)$") {
                Write-I18n "[!]" $I18n.InvalidExtension -SymbolColor Red
                $inputFile = ''
            }
        } while (-not $inputFile)
        $cmdParams.Add("-inputFile `"$inputFile`"") | Out-Null

        # Output file prompt
        $outputFile = ''
        Write-I18n "[*]" $I18n.EnterOutputFile -SymbolColor Green
        Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
        $outputFile = Read-Host
        if ($outputFile) {
            if ($outputFile -notmatch "\.(exe|com|scr|bin|bat|cmd)$") {
                Write-I18n "[!]" $I18n.OutputFileExtensionError -SymbolColor Red
                $outputFile += ".exe"
            }
            $cmdParams.Add("-outputFile `"$outputFile`"") | Out-Null
        }

        # Additional information prompt
        Write-I18n "[?]" $I18n.AddAdditionalInfo $I18n.AdditionalInfoPrompt -SymbolColor Blue -SequenceColor DarkGray
        Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
        if (IsEnable(Read-Host)) {
            Write-I18n "[~]" $I18n.CollectingInfo -SymbolColor Gray
            $resourceParams = @{}

            # Icon
            Write-I18n "[*]" $I18n.IconPath -SymbolColor Green
            Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
            $icon = Read-Host
            if ($icon) {
                if ($icon -notmatch '\.ico$') {
                    Write-I18n "[-]" $I18n.InvalidIconExtension -SymbolColor Red
                }
                elseif (-not (Test-Path $icon)) {
                    Write-I18n "[-]" $I18n.IconDoesNotExist -SymbolColor Red
                }
                else {
                    $resourceParams.iconFile = $icon
                }
            }

            # Other resources
            $resourcePrompts = @{
                title       = $I18n.EnterTitle
                description = $I18n.EnterDescription
                company     = $I18n.EnterCompany
                product     = $I18n.EnterProduct
                copyright   = $I18n.EnterCopyright
                trademark   = $I18n.EnterTrademark
            }
            foreach ($key in $resourcePrompts.Keys) {
                Write-I18n "[*]" ($I18n.EnterResourcePrompt -f $resourcePrompts[$key]) -SymbolColor Green
                Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
                $value = Read-Host
                if ($value) { $resourceParams[$key] = $value }
            }

            # Version
            Write-I18n "[*]" $I18n.Version -SymbolColor Green
            Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
            $version = Read-Host
            if ($version) {
                if ($version -notmatch '^\d+(\.\d+){0,3}$') {
                    Write-I18n "[-]" $I18n.InvalidVersionFormat -SymbolColor Red
                }
                else {
                    $resourceParams.version = $version
                }
            }

            if ($resourceParams.Count -gt 0) {
                $resourceParamsStr = $resourceParams.GetEnumerator() | ForEach-Object { "$($_.Key)='$($_.Value -replace "'", "''")'" } | Join-String -Separator '; '
                $cmdParams.Add("-resourceParams @{$resourceParamsStr}") | Out-Null
            }
        }
        else {
            Write-I18n "[~]" $I18n.SkippingAdditionalInfo -SymbolColor Gray
        }

        # Other options
        Write-I18n "[?]" $I18n.CompileAsGui $I18n.AdditionalInfoPrompt -SymbolColor Blue -SequenceColor DarkGray
        Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
        if (IsEnable(Read-Host)) {
            $cmdParams.Add("-noConsole") | Out-Null
        }

        Write-I18n "[?]" $I18n.RequireAdmin $I18n.AdditionalInfoPrompt -SymbolColor Blue -SequenceColor DarkGray
        Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
        if (IsEnable(Read-Host)) {
            $cmdParams.Add("-requireAdmin") | Out-Null
        }

        # Build and execute command
        Write-I18n "[~]" $I18n.BuildingCommand -SymbolColor Gray
        $scriptPath = Join-Path $PSScriptRoot '..\..\ps12exe.ps1'
        $command = "& `"$scriptPath`" " + ($cmdParams -join ' ')

        Write-I18n "[~]" $I18n.ExecutingCommand -SymbolColor Gray
        Write-Host $command

        try {
            Invoke-Expression $command
            if ($LASTEXITCODE -eq 0) {
                Write-I18n "[+]" $I18n.CompileSuccess -SymbolColor Green
            }
            else {
                Write-I18n "[!]" ($I18n.CompileFailed -f $LASTEXITCODE) -SymbolColor Red
            }
        }
        catch {
            Write-I18n "[!]" ($I18n.CompileFailedException -f $_.Exception.Message) -SymbolColor Red
        }

        Write-I18n "[?" $I18n.CompileAnother $I18n.AdditionalInfoPrompt -SymbolColor Blue -SequenceColor DarkGray
        Write-Host -ForegroundColor Gray $I18n.Prompt -NoNewline
        if (-not (IsEnable(Read-Host))) {
            break
        }
    }

    Write-I18n "[/]" $I18n.Exiting -SymbolColor Yellow
    [System.Console]::ReadKey() > $null
}
finally {
    $Host.UI.RawUI.WindowTitle = $OldTitle
}
#_else
#_require ps12exe
#_pragma iconFile $PSScriptRoot/../../img/icon.ico
#_pragma title ps12exe - Interact
#_pragma description 'A super cool tool for compile powershell scripts'
#_!!Enter-ps12exeInteract @PSBoundParameters
#_endif