PSWinTerminal.psm1


if ($env:WT_SESSION -and ($IsWindows -or ($PSVersionTable.PSVersion.Major -le 5))) {
    Write-Verbose "Identify WT version"
    if ($IsWindows) {
        Write-Verbose "PowerShell 6+"
        $Script:PSWinTerminalProcessPathFolder = (Get-Process -id $PID).Parent.Path | Split-Path
    } else {
        Write-Verbose "Windows PowerShell"
        $Script:PSWinTerminalProcessPathFolder = (Get-Process -id $((Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE ProcessID = $pid").ParentProcessID)).Path | split-path
    }
    Write-Verbose "Setting path to json files."
    if ( $Script:PSWinTerminalProcessPathFolder.contains('WindowsTerminalPreview') ) {
        $Script:PSWinTerminalConfigPath = "$env:LocalAppData\Packages\Microsoft.WindowsTerminalPreview_8wekyb3d8bbwe/LocalState\settings.json"
        $Script:PSWinTerminalDefaultsPath = "$Script:PSWinTerminalProcessPathFolder\defaults.json"
    } else {
        $Script:PSWinTerminalConfigPath = "$env:LocalAppData\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState\settings.json"
        $Script:PSWinTerminalDefaultsPath = "$Script:PSWinTerminalProcessPathFolder\defaults.json"
    }

    if ( ( Test-Path -LiteralPath $Script:PSWinTerminalDefaultsPath) ) {
        $Script:PSWinTerminalDefaults = (Get-Content -LiteralPath $Script:PSWinTerminalDefaultsPath | Where-Object { -not $_.Trim().StartsWith('//') } ) | ConvertFrom-Json
        $Script:PSWinTerminalDefaultThemes = $Script:PSWinTerminalDefaults.schemes.name
    }


    function Initialize-PSWinTerminalConfig {
        [CmdletBinding()]
        param (
        )
        begin {
        }
        process {
            if ( ( Test-Path -LiteralPath $Script:PSWinTerminalConfigPath) ) {
                $Script:PSWinTerminalConfig = (Get-Content -LiteralPath $Script:PSWinTerminalConfigPath | Where-Object { -not $_.Trim().StartsWith('//') } ) | ConvertFrom-Json
                $Script:PSWinTerminalThemes = $Script:PSWinTerminalConfig.schemes.name
                $Script:PSWinTerminalCurentProfile = $Script:PSWinTerminalConfig.profiles.list.GetEnumerator() | Where-Object { $_.guid -eq $env:WT_PROFILE_ID }

                if ($Script:PSWinTerminalCurentProfile.colorScheme) {
                    $Script:PSWinTerminalCurentProfileHasColorScheme = $true
                }
                else {
                    $Script:PSWinTerminalCurentProfileHasColorScheme = $false
                }
            }
        }
        end {
        }
    }
    function Get-WTTheme {
        <#
            .SYNOPSIS
                Get-WTTheme will get the current Windows Terminal theme
            .DESCRIPTION
                Get-WTTheme will get the current Windows Terminal theme, if these is no theme configured it'll return the default theme.
            .INPUTS
                These is no input for Get-WTTheme
            .OUTPUTS
                Name of the current theme
            .EXAMPLE
                Get-WTTheme
 
                Get-WTTheme will get the current Windows Terminal theme
            .LINK
                https://github.com/sassdawe/PSWinTerminal
        #>

        [CmdletBinding()]
        param (
        )
        begin {
        }

        process {
            if ($Script:PSWinTerminalCurentProfileHasColorScheme) {
                $Script:PSWinTerminalCurentProfile.colorScheme
            }
            else {
                Write-Output "Campbell"
            }
        }
        end {
        }
    }

    function Show-WTTheme {
        <#
            .SYNOPSIS
                Show-WTTheme will show all available Windows Terminal themes
            .DESCRIPTION
                Show-WTTheme will show all available Windows Terminal themes.
            .INPUTS
                These is no input for Show-WTTheme
            .OUTPUTS
                Array of available themes, the custom themes will have a (*) next to their names.
            .EXAMPLE
                Show-WTTheme
 
                Show-WTTheme will show all available Windows Terminal themes
            .LINK
                https://github.com/sassdawe/PSWinTerminal
        #>

        [CmdletBinding()]
        param (
        )

        begin {

        }

        process {
            $WTThemes = New-Object System.Collections.ArrayList
            $Script:PSWinTerminalDefaultThemes | ForEach-Object { $null = $WTThemes.Add("$_") }
            $Script:PSWinTerminalThemes | ForEach-Object { $null = $WTThemes.Add("$_ *") }
            $WTThemes.ToArray() | Sort-Object
        }

        end {

        }
    }

    function Set-WTTheme {
        <#
            .SYNOPSIS
                Set-WTTheme will change current Windows Terminal theme
            .DESCRIPTION
                Set-WTTheme will change the current Windows Terminal theme.
            .INPUTS
                Name of the theme we want to use for the current Windows Terminal profile
            .OUTPUTS
                None.
            .EXAMPLE
                Set-WTTheme "Campbell Powershell"
 
                Set-WTTheme will set current Windows Terminal theme to 'Campbell Powershell'
            .LINK
                https://github.com/sassdawe/PSWinTerminal
        #>

        [CmdletBinding(SupportsShouldProcess = $true)]
        param (
            # Name of theme
            [Parameter(Mandatory)]
            [System.String]
            $Theme
        )

        begin {
            Write-Verbose "Set-WTTheme - begin: $Theme"
        }

        process {
            if ( $Script:PSWinTerminalCurentProfileHasColorScheme -eq $false ) {
                Write-Verbose "Set-WTTheme - PSWinTerminalCurentProfileHasColorScheme FALSE"
                ( Get-Content -LiteralPath $Script:PSWinTerminalConfigPath | ForEach-Object { if ( $_.contains("`"guid`": `"$env:WT_PROFILE_ID`"") ) { "$_`n`t`t`t`t`"colorScheme`": `"$Theme`"," } else { $_ } } ) | Set-Content -LiteralPath $Script:PSWinTerminalConfigPath -PassThru:$false
                Initialize-PSWinTerminalConfig
                $Script:PSWinTerminalCurentProfileHasColorScheme = $true
            }
            else {
                Write-Verbose "Set-WTTheme - PSWinTerminalCurentProfileHasColorScheme TRUE"
                $currentProfileGuidLine = 0
                $content = Get-Content -LiteralPath $Script:PSWinTerminalConfigPath
                :guid Foreach ( $line in $content ) {
                    if ( $line.contains("`"guid`": `"$env:WT_PROFILE_ID`"") ) {
                        $currentProfileGuidLine += 1
                        break guid
                    }
                    else {
                        $currentProfileGuidLine += 1
                    }
                }
                Write-Verbose "Set-WTTheme - Guid is in line: $currentProfileGuidLine"
                for ($i = $currentProfileGuidLine - 1; $i -gt 0; $i--) {
                    # "$i" + $content[$i]
                    if ( $content[$i].Trim() -eq '{' ) {
                        $currentProfileStartLine = $i + 1
                        break
                    }
                }
                Write-Verbose "Set-WTTheme - Start is in line: $currentProfileStartLine"
                for ($i = $currentProfileStartLine - 1; $i -lt $content.Length; $i++ ) {
                    # "$i" + $content[$i]
                    if ( $content[$i].Trim() -eq '},' ) {
                        $currentProfileEndLine = $i + 1
                        break
                    }
                }
                Write-Verbose "Set-WTTheme - End is in line: $currentProfileEndLine"
                $newConfig = for ($i = 0; $i -lt $content.Length; $i++ ) {
                    if ( ($i -ge $currentProfileStartLine - 1) -and ($i -lt $currentProfileEndLine) ) {
                        if ( $content[$i].Contains("colorScheme") ) {
                            Write-Verbose "Old $( Get-WTTheme )"
                            $content[$i].Replace("`"colorScheme`": `"$( Get-WTTheme )`"", "`"colorScheme`": `"$Theme`"")
                            Write-Verbose "New $Theme"
                        }
                        else {
                            $content[$i]
                        }
                    }
                    else {
                        $content[$i]
                    }
                }
                $newConfig | Set-Content -LiteralPath $Script:PSWinTerminalConfigPath -PassThru:$false


                Initialize-PSWinTerminalConfig
            }
        }
        end {
            Write-Verbose "Set-WTTheme - end"
        }
    }

    Initialize-PSWinTerminalConfig

    Export-ModuleMember -Function * -Variable 'PSWinTerminalCurentProfileHasColorScheme'
}
else {
    Throw "You need to use Windows Terminal to use PSWinTerminal, and Windows"
}