# Put this in the location of $PROFILE. For PowerShell 5+ this is either
#   C:\Users\USERNAME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
# or
#   C:\Users\USERNAME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

function Prompt {
    if ($IsWindows -or ($env:OS -eq "Windows_NT")) {
        $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
        if ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
            return "# "
        }
    }
    return "> "
}

function ADUserInfo {
    param (
        [Parameter(Mandatory)]
        [string]$User
    )
    Import-Module ActiveDirectory -ErrorAction Stop
    $ADPropertiesCommon = @(
        'SamAccountName'
        'UserPrincipalName'
        'DisplayName'
        'Enabled'
        'PasswordExpired'
        'LockedOut'
        'CannotChangePassword'
        'PasswordNeverExpires'
        'GivenName'
        'Surname'
        'DistinguishedName'
        'EmployeeID'
        'Title'
        'Department'
        'Created'
        'Modified'
        'PasswordLastSet'
    )
    $ADPropertiesGetOnly = @(
        'msDS-UserPasswordExpiryTimeComputed'
    )
    $ADPropertiesPrintOnly = @(
        @{Name = "PasswordExpiresDate"; Expression = { [datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") } }
    )
    $ADPropertiesGet = $ADPropertiesCommon + $ADPropertiesGetOnly
    $ADPropertiesPrint = $ADPropertiesCommon + $ADPropertiesPrintOnly
    Get-ADUser -Properties $ADPropertiesGet -Identity $User | Select-Object -Property $ADPropertiesPrint
}

function mkcd {
    param (
        [Parameter(Mandatory)]
        [string]$Path
    )
    New-Item -ItemType Directory -Path $Path
    Set-Location -Path $Path
}

function Set-AcpLocale {
    # Set the default en-GB locale.
    Set-WinUserLanguageList -LanguageList en-GB -Force
    # Get the default locale back.
    $AcpLocale = Get-WinUserLanguageList
    # Remove the British layout and add the US layout.
    $AcpLocale[0].InputMethodTips.Remove("0809:00000809") | Out-Null
    $AcpLocale[0].InputMethodTips.Add("0809:00000409") | Out-Null
    # Set the locale to our customised version.
    Set-WinUserLanguageList -LanguageList $AcpLocale -Force
    # Clean up.
    Remove-Variable AcpLocale
}

if ($IsWindows -or ($env:OS -eq "Windows_NT")) {
    function who {
        & "$env:SystemRoot\System32\query.exe" user
    }

    # Drop elevation privileges.
    $env:__COMPAT_LAYER = "RunAsInvoker"
}

if ($nvim = Get-Command nvim.exe -ErrorAction SilentlyContinue) {
    Set-Alias -Name vi -Value $nvim.Source
}
Remove-Variable -Name nvim

# Force UTF-8 output.
$OutputEncoding = [System.Text.Encoding]::UTF8

Set-PSReadLineOption -BellStyle None
Set-PSReadLineOption -EditMode Emacs
Set-PSReadLineOption -HistorySaveStyle SaveNothing

Remove-PSReadLineKeyHandler -Chord Tab
Set-PSReadLineKeyHandler -Chord UpArrow -ScriptBlock {
    [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward()
    [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
Set-PSReadLineKeyHandler -Chord DownArrow -ScriptBlock {
    [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward()
    [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
Set-PSReadLineKeyHandler -Chord Ctrl+LeftArrow -Function BackwardWord
Set-PSReadLineKeyHandler -Chord Ctrl+RightArrow -Function ForwardWord
Set-PSReadLineKeyHandler -Chord Ctrl+Backspace -Function BackwardKillWord
Set-PSReadLineKeyHandler -Chord Ctrl+Delete -Function KillWord
Set-PSReadLineKeyHandler -Chord Shift+Spacebar -Function SelfInsert

# Set terminal to light mode.
foreach ($Property in $Host.PrivateData.PSObject.Properties.Name) {
    if ($Property -match '.*ForegroundColor$') {
        $Host.PrivateData.$Property = $Host.UI.RawUI.ForegroundColor
    }
    if ($Property -match '.*BackgroundColor$') {
        $Host.PrivateData.$Property = $Host.UI.RawUI.BackgroundColor
    }
}

function Set-AntDarkMode {
    if ($PSVersionTable.PSVersion.Major -le 5) {
        # $PSStyle doesn't exist in PowerShell 5.1, so import the external module.
        Import-Module -Name PSStyle
    }

    $DefaultTheme = @{
        Command                = "$([char]0x1b)[93m"
        Comment                = "$([char]0x1b)[32m"
        ContinuationPrompt     = "$([char]0x1b)[33m"
        Default                = "$([char]0x1b)[33m"
        Emphasis               = "$([char]0x1b)[96m"
        Error                  = "$([char]0x1b)[91m"
        InlinePrediction       = "$([char]0x1b)[38;5;238m"
        Keyword                = "$([char]0x1b)[92m"
        ListPrediction         = "$([char]0x1b)[33m"
        ListPredictionSelected = "$([char]0x1b)[48;5;238m"
        ListPredictionTooltip  = "$([char]0x1b)[38;5;238m"
        Member                 = "$([char]0x1b)[37m"
        Number                 = "$([char]0x1b)[97m"
        Operator               = "$([char]0x1b)[90m"
        Parameter              = "$([char]0x1b)[90m"
        Selection              = "$([char]0x1b)[35;43m"
        String                 = "$([char]0x1b)[36m"
        Type                   = "$([char]0x1b)[37m"
        Variable               = "$([char]0x1b)[92m"
    }

    $PSStyle.Formatting.FormatAccent = "$([char]0x1b)[32;1m"
    $PSStyle.Formatting.TableHeader = "$([char]0x1b)[32;1m"
    $PSStyle.Formatting.ErrorAccent = "$([char]0x1b)[36;1m"
    $PSStyle.Formatting.Error = "$([char]0x1b)[31;1m"
    $PSStyle.Formatting.Warning = "$([char]0x1b)[33;1m"
    $PSStyle.Formatting.Verbose = "$([char]0x1b)[33;1m"
    $PSStyle.Formatting.Debug = "$([char]0x1b)[33;1m"
    $PSStyle.Progress.Style = "$([char]0x1b)[33;1m"
    $PSStyle.FileInfo.Directory = "$([char]0x1b)[44;1m"
    $PSStyle.FileInfo.SymbolicLink = "$([char]0x1b)[36;1m"
    $PSStyle.FileInfo.Executable = "$([char]0x1b)[32;1m"

    Set-PSReadLineOption -Colors $DefaultTheme
}

function Set-AntLightMode {
    # https://learn.microsoft.com/en-us/powershell/scripting/learn/shell/using-light-theme

    if ($PSVersionTable.PSVersion.Major -le 5) {
        # $PSStyle doesn't exist in PowerShell 5.1, so import the external module.
        Import-Module -Name PSStyle
    }

    $ISETheme = @{
        Command                = $PSStyle.Foreground.FromRGB(0x0000FF)
        Comment                = $PSStyle.Foreground.FromRGB(0x006400)
        ContinuationPrompt     = $PSStyle.Foreground.FromRGB(0x0000FF)
        Default                = $PSStyle.Foreground.FromRGB(0x0000FF)
        Emphasis               = $PSStyle.Foreground.FromRGB(0x287BF0)
        Error                  = $PSStyle.Foreground.FromRGB(0xE50000)
        InlinePrediction       = $PSStyle.Foreground.FromRGB(0x93A1A1)
        Keyword                = $PSStyle.Foreground.FromRGB(0x00008b)
        ListPrediction         = $PSStyle.Foreground.FromRGB(0x06DE00)
        Member                 = $PSStyle.Foreground.FromRGB(0x000000)
        Number                 = $PSStyle.Foreground.FromRGB(0x800080)
        Operator               = $PSStyle.Foreground.FromRGB(0x757575)
        Parameter              = $PSStyle.Foreground.FromRGB(0x000080)
        String                 = $PSStyle.Foreground.FromRGB(0x8b0000)
        Type                   = $PSStyle.Foreground.FromRGB(0x008080)
        Variable               = $PSStyle.Foreground.FromRGB(0xff4500)
        ListPredictionSelected = $PSStyle.Background.FromRGB(0x93A1A1)
        Selection              = $PSStyle.Background.FromRGB(0x00BFFF)
    }

    $PSStyle.Formatting.FormatAccent = "$([char]0x1b)[32m"
    $PSStyle.Formatting.TableHeader = "$([char]0x1b)[32m"
    $PSStyle.Formatting.ErrorAccent = "$([char]0x1b)[36m"
    $PSStyle.Formatting.Error = "$([char]0x1b)[31m"
    $PSStyle.Formatting.Warning = "$([char]0x1b)[33m"
    $PSStyle.Formatting.Verbose = "$([char]0x1b)[33m"
    $PSStyle.Formatting.Debug = "$([char]0x1b)[33m"
    $PSStyle.Progress.Style = "$([char]0x1b)[33m"
    $PSStyle.FileInfo.Directory = $PSStyle.Background.FromRgb(0x2f6aff) +
    $PSStyle.Foreground.BrightWhite
    $PSStyle.FileInfo.SymbolicLink = "$([char]0x1b)[36m"
    $PSStyle.FileInfo.Executable = "$([char]0x1b)[95m"
    if ($PSVersionTable.PSVersion.Major -gt 5) {
        $PSStyle.FileInfo.Extension['.ps1'] = "$([char]0x1b)[36m"
        $PSStyle.FileInfo.Extension['.ps1xml'] = "$([char]0x1b)[36m"
        $PSStyle.FileInfo.Extension['.psd1'] = "$([char]0x1b)[36m"
        $PSStyle.FileInfo.Extension['.psm1'] = "$([char]0x1b)[36m"
    }

    Set-PSReadLineOption -Colors $ISETheme
}
Set-AntLightMode

# Keep this at the end.
if (Test-Path "$PSScriptRoot/local.ps1") {
    . "$PSScriptRoot/local.ps1"
}