functions/Remove-User.ps1


function Remove-User {
    <#
    .SYNOPSIS
        Deletes a user.
    .DESCRIPTION
        Deletes a user by Id or External Id.
    .EXAMPLE
        PS C:\> Remove-ZendeskUser -Id 1

        Soft deletes a user with id 1
    .EXAMPLE
        PS C:\> Remove-ZendeskUser -Id 1, 2, 3

        Soft deletes users with ids 1, 2, and 3
    .EXAMPLE
        PS C:\> Remove-ZendeskUser -ExternalId 1

        Soft deletes a user with external id 1
    .EXAMPLE
        PS C:\> Remove-ZendeskUser -Id 1 -Permanent

        Permanently deletes an already soft deleted user with id 1
    #>

    [OutputType([PSCustomObject])]
    [CMDletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'High', DefaultParameterSetName = 'Id')]
    Param (
        # Unique Id of the user to delete
        [Parameter(Mandatory = $true, ParameterSetName = 'Id')]
        [ValidateRange(1, [Int64]::MaxValue)]
        [Int64[]]
        $Id,

        # Unique Id of the user to delete
        [Parameter(Mandatory = $true, ParameterSetName = 'ExternalId')]
        [ValidateNotNullOrEmpty()]
        [String[]]
        $ExternalId,

        # Permanently delete soft deleted user
        [Parameter(Mandatory = $false, ParameterSetName = 'Id')]
        [Switch]
        $Permanent,

        # Zendesk Connection Context from `Get-ZendeskConnection`
        [Parameter(Mandatory = $false)]
        [PSTypeName('ZendeskContext')]
        [PSCustomObject]
        $Context = $null
    )

    Assert-IsAgent -Context $Context

    if ($PSCmdlet.ParameterSetName -eq 'Id') {
        if ($Permanent) {
            if ($Id.count -eq 1) {
                $path = "/api/v2/deleted_users/$Id.json"
            } else {
                throw 'Can only permanently delete one user at a time.'
            }
        } else {
            if ($Id.count -gt 1) {
                Assert-IsAdmin -Context $Context
                $ids = $Id -join ','
                $path = "/api/v2/users/destroy_many.json?ids=$ids"
            } else {
                $path = "/api/v2/users/$Id.json"
            }
        }
    } else {
        Assert-IsAdmin -Context $Context
        $ids = $ExternalId -join ','
        $path = "/api/v2/users/destroy_many.json?external_ids=$ids"
    }

    if ($PSCmdlet.ShouldProcess($Id, 'Delete User')) {
        $result = Invoke-Method -Context $Context -Method 'Delete' -Path $path -Verbose:$VerbosePreference
        $result
    }

}