src/GUI/GUIMainScript.ps1

. "$PSScriptRoot\UITools.ps1"

. "$PSScriptRoot\DialogLoader.ps1"

. "$PSScriptRoot\Functions.ps1"

. "$PSScriptRoot\AutoFixer.ps1"

. "$PSScriptRoot\DarkMode.ps1"

. "$PSScriptRoot\Events.ps1"

#region Other Actions Before ShowDialog

if ($ConfigFile) {
    [string]$Script:ConfigFile = Resolve-Path -LiteralPath $ConfigFile
    # if file not exists or empty
    if (!(Test-Path $ConfigFile) -or (Get-Item $ConfigFile).Length -eq 0) {
        SetCfgFile $ConfigFile
    }
    else {
        LoadCfgFile $ConfigFile
    }
}

if ($PS1File) {
    [string]$PS1File = Resolve-Path -LiteralPath $PS1File
    if (-not $Script:ConfigFile) {
        SetCfgFile "$($PS1File.Substring(0, $PS1File.LastIndexOf('.'))).psccfg"
    }
    # 计算相对于$ConfigFile的相对路径
    $PS1FilePath = Resolve-Path -LiteralPath $PS1File -Relative -RelativeBasePath (Split-Path $ConfigFile)
    if (!$PS1FilePath) { $PS1FilePath = "./$(Split-Path $PS1File -Leaf)" }
    $Script:refs.CompileFileTextBox.Text = $PS1FilePath
}

try {
    Import-Module "$PSScriptRoot/../../ps12exe.psm1" -Force -ErrorAction Stop
}
catch {
    Update-ErrorLog -ErrorRecord $_ -Message "Exception encountered when importing ps12exe."
}

#endregion Other Actions Before ShowDialog

# Set Console Window Title
try {
    # Hide Console Window
    $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

    # load bgm
    $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
    # play music as loop
    $IsAlreadyPlayingSomething = [ps12exeGUI.Win32]::IsPlayingSound()
    [ps12exeGUI.Win32]::mciSendString("play ps12exeGUIBGM repeat", $null, 0, 0) | Out-Null
    if ($IsAlreadyPlayingSomething) { PauseMusic }

    # Show the form
    try { [void]$Script:refs.MainForm.ShowDialog() } catch { Update-ErrorLog -ErrorRecord $_ -Message "Exception encountered unexpectedly at ShowDialog." }
}
finally {
    # Dispose all controls
    foreach ($Ctrl in $Script:refs.Values) {
        @('Icon', 'BackGroundImage') | ForEach-Object {
            if ($Ctrl.$_ -is [IDisposable]) { $Ctrl.$_.Dispose() }
        }
        if ($Ctrl -is [IDisposable]) { $Ctrl.Dispose() }
    }
    foreach ($key in $Script:dialogInfo.Keys) {
        $Dlg = Get-Variable -Name $key -ValueOnly
        $Dlg.Dispose()
    }

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

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

    # Remove all variables in the script scope
    Get-Variable -Scope Script | Remove-Variable -Scope Script -Force -ErrorAction Ignore
}