<#
.SYNOPSIS
    Creates a new incident in ServiceNow.
.DESCRIPTION
    This function creates a new incident in ServiceNow using the provided parameters. It requires either the caller's username or email, along with a short description and a detailed description of the incident.
.PARAMETER CallerUsername
    The username of the caller reporting the incident. This parameter is mandatory if CallerEmail is not provided.
.PARAMETER CallerEmail
    The email address of the caller reporting the incident. This parameter is mandatory if CallerUsername is not provided.
.PARAMETER ShortDescription
    A brief summary of the incident.
.PARAMETER Description
    A detailed description of the incident.
.PARAMETER Impact
    The impact level of the incident. Valid values are 1 (High), 2 (Medium), and 3 (Low). Default is 3.
.PARAMETER Urgency
    The urgency level of the incident. Valid values are 1 (High), 2 (Medium), and 3 (Low). Default is 3.
.PARAMETER Category
    The category of the incident.
.EXAMPLE
    New-ITDServiceNowIncident -CallerUsername 'jdoe' -ShortDescription 'System outage' -Description 'The system is down and not responding.' -Impact 1 -Urgency 1 -Category 'Network'
    This example creates a new high-impact, high-urgency incident for a system outage reported by the user 'jdoe'.
#>

function New-ITDServiceNowIncident {
    [CmdletBinding()]
    param (
        [Parameter(ParameterSetName = 'CallerUsername', Mandatory = $true)]
        [string]
        $CallerUsername,

        [Parameter(ParameterSetName = 'CallerEmail', Mandatory = $true)]
        [string]
        $CallerEmail,

        [Parameter(Mandatory = $true)]
        [string]
        $ShortDescription,

        [Parameter(Mandatory = $true)]
        [string]
        $Description,

        [ValidateRange(1, 3)]
        [int]
        $Impact = 3,

        [ValidateRange(1, 3)]
        [int]
        $Urgency = 3,

        [string]
        $Category,

        [string]
        $Subcategory,

        [string]
        $AssignmentGroup,

        [string]
        $AssignedTo
    )
    
    begin {
        
    }
    
    process {
        # determine caller id
        switch ($PSCmdlet.ParameterSetName) {
            'CallerUsername' {
                $Caller = Get-ITDServiceNowUser -Username $CallerUsername
            }
            'CallerEmail' {
                $Caller = Get-ITDServiceNowUser -Email $CallerEmail
            }
        }

        If (@($Caller).count -gt 1) {
            Write-Error "Multiple users found, incident creation failed." -ErrorAction Stop
        }

        [PSCustomObject]$NewRecord = @{
            caller_id         = $Caller.sys_id
            short_description = $ShortDescription;
            description       = $Description;
            impact            = $Impact;
            urgency           = $Urgency;
            category          = $Category;
            subcategory       = $Subcategory

        }

        If ($AssignmentGroup) {
            $AssGroup = Get-ITDServiceNowUserGroup -Name $AssignmentGroup
            If (@($AssGroup).count -gt 1) {
                Write-Error "Multiple assignment groups found, incident creation failed." -ErrorAction Step
            }
            Else {
                $NewRecord += @{assignment_group = $AssGroup.sys_id }
            }
        }
        
        $InvokeRestMethodParams = @{
            Method      = 'Post';
            Uri         = ($Script:ServiceNowSession.Uri + "/api/now/table/incident");
            Body        = $NewRecord | ConvertTo-Json;
            Headers     = $Script:ServiceNowSession.Headers;
            ContentType = "application/json"
        }

        #Write-Output $InvokeRestMethodParams
        $result = Invoke-RestMethod @InvokeRestMethodParams
    }
    
    end {
        $result #| select number, impact, urgency, assignment_group, short_description
    }
}