src/GUI/GUIMainScript.ps1

. "$PSScriptRoot\UItools.ps1"

#region Locale Data

$Script:LocalizeData = ."$PSScriptRoot/../LocaleLoader.ps1" -Locale $Locale -LoadLocaleData {
    param (
        [string]$Locale
    )
    $Script:LocalizeData = &"$LocalizeDir\$Locale.ps1"
} -CheckLocaleData {
    $null -ne $Script:LocalizeData -and $null -ne $Script:LocalizeData.GUI
} -FailedLoadLocaleData {
    param (
        [string]$Locale
    )
    [System.Windows.Forms.MessageBox]::Show("Failed to load locale data $Locale`nSee $LocalizeDir/README.md for how to add custom locale.", "ps12exe GUI locale Error", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning)
}

#endregion Locale Data

. "$PSScriptRoot\Functions.ps1"

. "$PSScriptRoot\Schema.ps1"

. "$PSScriptRoot\Layout.ps1"

. "$PSScriptRoot\Compile.ps1"

. "$PSScriptRoot\DarkMode.ps1"

. "$PSScriptRoot\Events.ps1"

#region Other Actions Before ShowDialog

$Script:GUISchema = Get-GUISchema

$Script:refs = @{}
$Script:FieldControls = @{}
$Script:FieldBrowse = @{}
New-GUIForm | Out-Null
$Script:dialogs = New-GUIDialogs

Update-UIState
Set-DarkMode $Script:DarkMode
Register-GUIEvents

if ($ConfigFile) {
    [string]$Script:ConfigFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($ConfigFile)
    # 如果文件不存在或为空
    if (!(Test-Path -LiteralPath $Script:ConfigFile) -or (Get-Item -LiteralPath $Script:ConfigFile).Length -eq 0) {
        SetCfgFile $Script:ConfigFile
    }
    else {
        LoadCfgFile $Script:ConfigFile
    }
}

if ($PS1File) {
    [string]$PS1File = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($PS1File)
    if (-not $Script:ConfigFile) {
        SetCfgFile "$($PS1File.Substring(0, $PS1File.LastIndexOf('.'))).psccfg"
    }
    # 计算相对于配置文件目录的相对路径(不用 pwsh 7.4+ 的 -RelativeBasePath)
    $ConfigDir = Split-Path -Path $Script:ConfigFile -Parent
    $PS1FilePath = Get-RelativePath $PS1File $ConfigDir
    if (!$PS1FilePath) { $PS1FilePath = "./$(Split-Path $PS1File -Leaf)" }
    $Script:refs.CompileFileTextBox.Text = $PS1FilePath
}

#endregion Other Actions Before ShowDialog

# 设置控制台窗口标题
try {
    # 隐藏控制台窗口
    $consolePtr = [ps12exeGUI.Win32]::GetConsoleWindow()
    [ps12exeGUI.Win32]::ShowWindow($consolePtr, 0) | Out-Null

    $Icon = [System.Drawing.Icon]::ExtractAssociatedIcon("$PSScriptRoot\..\..\img\icon.ico")
    $Script:refs.MainForm.Icon = $Icon
    $Script:refs.MainForm.StartPosition = 'CenterScreen'

    # 加载背景音乐
    $FS = New-Object -ComObject Scripting.FileSystemObject
    $bgmFile = $FS.GetFile("$PSScriptRoot\..\bin\Unravel.mid")
    [ps12exeGUI.Win32]::mciSendString("open `"$($bgmFile.ShortPath)`" alias ps12exeGUIBGM type MPEGVideo", $null, 0, 0) | Out-Null
    # 循环播放音乐
    $IsAlreadyPlayingSomething = [ps12exeGUI.Win32]::IsPlayingSound()
    [ps12exeGUI.Win32]::mciSendString("play ps12exeGUIBGM repeat", $null, 0, 0) | Out-Null
    if ($IsAlreadyPlayingSomething) { PauseMusic }

    # 显示窗体
    try { [void]$Script:refs.MainForm.ShowDialog() } catch { Update-ErrorLog -ErrorRecord $_ -Message "Exception encountered unexpectedly at ShowDialog." }
}
finally {
    # 停掉深色模式跟随定时器
    if ($Script:DarkModeTimer) {
        $Script:DarkModeTimer.Stop()
        $Script:DarkModeTimer.Dispose()
        $Script:DarkModeTimer = $null
    }

    # 释放窗体和文件对话框
    if ($Script:refs.MainForm) { $Script:refs.MainForm.Dispose() }
    if ($Script:dialogs) {
        foreach ($dialog in $Script:dialogs.Values) {
            if ($dialog -is [IDisposable]) { $dialog.Dispose() }
        }
    }

    [ps12exeGUI.Win32]::ShowWindow($consolePtr, 1) | Out-Null

    [ps12exeGUI.Win32]::mciSendString("close ps12exeGUIBGM", $null, 0, 0) | Out-Null

    # 移除脚本作用域中的所有变量
    Get-Variable -Scope Script | Remove-Variable -Scope Script -Force -ErrorAction Ignore
}