Public/Setup/Dropdowns/Get-GlpiToolsDropdownsStatusesOfItems.ps1

<#
.SYNOPSIS
    Function gets statuses of items
.DESCRIPTION
    Function gets statuses of items which can be defined in dropowns
.PARAMETER All
    This parameter will return all States from GLPI
.PARAMETER StatesId
    This parameter can take pipline input, either, you can use this function with -StatesId keyword.
    Provide to this param States ID from GLPI Statuses of items Bookmark
.PARAMETER Raw
    Parameter which you can use with StatesId Parameter.
    StatesId has converted parameters from default, parameter Raw allows not convert this parameters.
.PARAMETER StatesName
    Provide to this param States Name from GLPI States Bookmark
.EXAMPLE
    PS C:\> Get-GlpiToolsDropdownsStatusesOfItems -All
    Example will return all States from States.
.EXAMPLE
    PS C:\> 326 | Get-GlpiToolsDropdownsStatusesOfItems
    Function gets StatesID from GLPI from Pipline, and return States object
.EXAMPLE
    PS C:\> 326, 321 | Get-GlpiToolsDropdownsStatusesOfItems
    Function gets StatesID from GLPI from Pipline (u can pass many ID's like that), and return States object
.EXAMPLE
    PS C:\> Get-GlpiToolsDropdownsStatusesOfItems -StatesId 326
    Function gets StatesID from GLPI which is provided through -StatesId after Function type, and return States object
.EXAMPLE
    PS C:\> Get-GlpiToolsDropdownsStatusesOfItems -StatesId 326, 321
    Function gets StatesID from GLPI which is provided through -StatesId keyword after Function type (u can provide many ID's like that), and return States object
.EXAMPLE
    PS C:\> Get-GlpiToolsDropdownsStatusesOfItems -StatesId 234 -Raw
    Example will show States with id 234, but without any parameter converted
.EXAMPLE
    PS C:\> 234 | Get-GlpiToolsDropdownsStatusesOfItems -Raw
    Example will show States with id 234, but without any parameter converted
.EXAMPLE
    PS C:\> Get-GlpiToolsDropdownsStatusesOfItems -StatesName glpi
    Example will return glpi States, but what is the most important, States will be shown exactly as you see in glpi Statuses of items tab.
    If you want to add parameter, you have to modify "default items to show". This is the "key/tool" icon near search.
.INPUTS
    StateId, StateName
.OUTPUTS
    Function returns PSCustomObject with statuses of items from GLPI
.NOTES
    PSP 01/2019
#>


function Get-GlpiToolsDropdownsStatusesOfItems {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $false,
            ParameterSetName = "All")]
        [switch]$All,

        [parameter(Mandatory = $true,
            ValueFromPipeline = $true,
            ParameterSetName = "StatesId")]
        [alias('SID')]
        [string[]]$StatesId,
        [parameter(Mandatory = $false,
            ParameterSetName = "StatesId")]
        [switch]$Raw,

        [parameter(Mandatory = $true,
            ParameterSetName = "StatesName")]
        [alias('SN')]
        [string]$StatesName
    )
    
    begin {

        $SessionToken = $Script:SessionToken    
        $AppToken = $Script:AppToken
        $PathToGlpi = $Script:PathToGlpi

        $SessionToken = Set-GlpiToolsInitSession | Select-Object -ExpandProperty SessionToken
        $AppToken = Get-GlpiToolsConfig | Select-Object -ExpandProperty AppToken
        $PathToGlpi = Get-GlpiToolsConfig | Select-Object -ExpandProperty PathToGlpi

        $ChoosenParam = ($PSCmdlet.MyInvocation.BoundParameters).Keys

        $StatesArray = [System.Collections.Generic.List[PSObject]]::New()
    }
    
    process {
        switch ($ChoosenParam) {
            All {
                $params = @{
                    headers = @{
                        'Content-Type'  = 'application/json'
                        'App-Token'     = $AppToken
                        'Session-Token' = $SessionToken
                    }
                    method  = 'get'
                    uri     = "$($PathToGlpi)/State/?range=0-9999999999999"
                }
                
                $GlpiStatesAll = Invoke-RestMethod @params -Verbose:$false

                foreach ($GlpiStates in $GlpiStatesAll) {
                    $StatesHash = [ordered]@{ }
                            $StatesProperties = $GlpiStates.PSObject.Properties | Select-Object -Property Name, Value 
                                
                            foreach ($StatesProp in $StatesProperties) {
                                $StatesHash.Add($StatesProp.Name, $StatesProp.Value)
                            }
                            $object = [pscustomobject]$StatesHash
                            $StatesArray.Add($object)
                }
                $StatesArray
                $StatesArray = [System.Collections.Generic.List[PSObject]]::New()
            }
            StatesId {
                foreach ( $SId in $StatesId ) {
                    $params = @{
                        headers = @{
                            'Content-Type'  = 'application/json'
                            'App-Token'     = $AppToken
                            'Session-Token' = $SessionToken
                        }
                        method  = 'get'
                        uri     = "$($PathToGlpi)/State/$($SId)"
                    }

                    Try {
                        $GlpiStates = Invoke-RestMethod @params -ErrorAction Stop

                        if ($Raw) {
                            $StatesHash = [ordered]@{ }
                            $StatesProperties = $GlpiStates.PSObject.Properties | Select-Object -Property Name, Value 
                                
                            foreach ($StatesProp in $StatesProperties) {
                                $StatesHash.Add($StatesProp.Name, $StatesProp.Value)
                            }
                            $object = [pscustomobject]$StatesHash
                            $StatesArray.Add($object)
                        } else {
                            $StatesHash = [ordered]@{ }
                            $StatesProperties = $GlpiStates.PSObject.Properties | Select-Object -Property Name, Value 
                                
                            foreach ($StatesProp in $StatesProperties) {

                                switch ($StatesProp.Name) {
                                    entities_id { $StatesPropNewValue = $StatesProp.Value | Get-GlpiToolsEntities | Select-Object -ExpandProperty CompleteName }
                                    Default {
                                        $StatesPropNewValue = $StatesProp.Value
                                    }
                                }

                                $StatesHash.Add($StatesProp.Name, $StatesPropNewValue)
                            }
                            $object = [pscustomobject]$StatesHash
                            $StatesArray.Add($object)
                        }
                    } Catch {

                        Write-Verbose -Message "State ID = $SId is not found"
                        
                    }
                    $StatesArray
                    $StatesArray = [System.Collections.Generic.List[PSObject]]::New()
                }
            }
            StatesName {
                Search-GlpiToolsItems -SearchFor State -SearchType contains -SearchValue $StatesName
            }
            Default {}
        }
    }
    
    end {
        Set-GlpiToolsKillSession -SessionToken $SessionToken
    }
}