function Set-CMDBLocation {
    [CmdletBinding()]
    param (
        [Parameter()]
        [string]
        $Hostname
    )

    process {

        

        
        try { 
            ## $cmdbData = Get-LANDeskCMDBItem -Name $Hostname 
            $cmdbRecord = Search-ISMBO -BO cis -filter "Name eq '$Hostname'" -RawFilter
        } catch { $cmdbData = $null}
        if($null -eq $cmdbData){
            $getpcData = Get-PCBatchInvoke $Hostname
            $asset = $getpcData.'Asset Tag'
            $asset = $asset -split ' '
            $asset = $asset[0]
            try { 
                
                ## $cmdbData = Get-LANDeskCMDBItem -AssetTag $asset
                $cmdbData = Search-ISMBO -BO cis -filter "AssetTag eq '$asset'" -RawFilter
            
            } catch{ $cmdbData = $null }
            if($null -eq $cmdbData){
                Write-Warning "Unable to find record with that hostname or assset tag in CMDB"
                return
            }
        }
        $oldLocation = $cmdbData.Values._SHSLocation3
        $key = $cmdbData.key
        Write-Host "Hostname: $hostname"
        Write-Host "Current Location: $oldLocation"
        $newLocation = Read-Host "New Location"

        try {Set-LANDeskCMDBWorkstation -LocationDetails $newLocation -Key $key | Out-Null } 
        catch {
            Write-Warning "Unable to change location data"
            return
        }
        try { 
            ## $cmdbData = Get-LANDeskCMDBItem -Name $Hostname 
            $cmdbData = Search-ISMBO -BO cis -filter "Hostname eq '$Hostname'" -RawFilter
            
        } catch { $cmdbData = $null}
        if($null -eq $cmdbData){
            try { 
                ##$cmdbData = Get-LANDeskCMDBItem -AssetTag $asset
                $cmdbData = Search-ISMBO -BO cis -filter "AssetTag eq '$asset'" -RawFilter
            } catch{ $cmdbData = $null }
            if($null -eq $cmdbData){
                Write-Warning "Unable to find record with that hostname or assset tag in CMDB"
                return
            }
        }

        $newLocation = $cmdbData.values._SHSLocation3
        Write-Host "Location now set to: $newLocation" -ForegroundColor Green
    }
}

function Set-LANDeskCMDBLocation {
    [CmdletBinding(DefaultParameterSetName="Default")]
    param (
        [Parameter(HelpMessage = 'The Name of the new CMDB item',      
            Mandatory = $true
        )]
        [string]$Name,
        [Parameter(HelpMessage = 'Enter the Location Details for the CMDB Item')]
        [string]$LocationDetails,

        [Parameter(HelpMessage = 'Enter the GUID for the CMDB Item')]
        [string]$Key,
        
        [Parameter(HelpMessage = 'Specifying Server',
            Mandatory = $false,
            DontShow = $true)]
        [string] $server = $(Connect-LANDesk)[1],
        [Parameter(HelpMessage = 'Specifying LanDesk Framework for api',
            Mandatory = $false,
            DontShow = $true)]
        [string] $framework = $(Connect-LANDesk)[2], 
        [Parameter(HelpMessage = 'Specifying LanDesk Headers for api',
            Mandatory = $false,
            DontShow = $true)]
        [hashtable] $Headers = $(Connect-LANDesk)[0]
    )
    
    begin {
    }
    
    process {
        [object[]]$Values = $null

        $Title = @{}
        $Title.Name = "Title"
        $Title.Value = $Name
        [object[]]$Values += $Title
        
        <#
        $_ConfigTypesCategory = @{}
        $_ConfigTypesCategory.Name = "_ConfigTypesCategory"
        $_ConfigTypesCategory.Value = '9dadd9f9-ca5d-4be6-93cc-6c8745fff615'
        $Values += $_ConfigTypesCategory
        #>
        $LocationDetails
        $_SHSLocation3 = @{}
        $_SHSLocation3.Name = "_SHSLocation3"
        $_SHSLocation3.Value = $LocationDetails
        $Values += $_SHSLocation3

        $body =  [ordered]@{}
        $body.class_name = '_CMDBManagement.Call'
        $Body.originalValues = $Values
        $body.formValues = $Values 
        $body = $body | ConvertTo-Json

        $uri = 'http://' + $server + '/' + $framework + '/api/form?class_name=_CMDBManagement.Call&key=' + $Key + '&function_name=Edit&v=*'    
        Invoke-RestMethod -Uri $uri -Headers $headers -Body $Body -Method Patch

    }
    
    end {
    }
}

function Set-LANDeskCMDBWorkstation {
    [CmdletBinding(DefaultParameterSetName="Default")]
    param (
        [Parameter(HelpMessage = 'The Name of the new CMDB item')]
        [string]$Name,

        [Parameter(HelpMessage = 'Enter the PO for the CMDB Item')]
        [string]$PO,

        [Parameter(HelpMessage = 'Enter the Physical Location for the CMDB Item')]
        [string]$PhysicalLocation,

        [Parameter(HelpMessage = 'Enter the Asset Tag for the CMDB Item')]
        [string]$AssetTag,

        [Parameter(HelpMessage = 'Enter the RequestID for the CMDB Item')]
        [string]$RequestID,

        [Parameter(HelpMessage = 'Enter the OperatingSystem for the CMDB Item')]
        [string]$OperatingSystem,
        
        [Parameter(HelpMessage = 'Enter the ChassisType for the CMDB Item')]
        [string]$ChassisType,
        
        [Parameter(HelpMessage = 'Enter the Total Hard Drive Size for the CMDB Item')]
        [string]$HDD,
        
        [Parameter(HelpMessage = 'Enter the RAM for the CMDB Item')]
        [string]$RAM,
        
        [Parameter(HelpMessage = 'Enter the Hard drive space Avalible for the CMDB Item')]
        [string]$HDDAvail,
        
        [Parameter(HelpMessage = 'Enter the IPAddress for the CMDB Item')]
        [string]$IPAddress,
        
        [Parameter(HelpMessage = 'Enter the KioskRole for the CMDB Item')]
        [string]$KioskRole,
        
        [Parameter(HelpMessage = 'Enter the Model for the CMDB Item')]
        [string]$Model,
        
        [Parameter(HelpMessage = 'Enter the SerialNumber for the CMDB Item')]
        [string]$SerialNumber,
        
        [Parameter(HelpMessage = 'Enter the Notes for the CMDB Item')]
        [string]$Notes,
        
        [Parameter(HelpMessage = 'Enter the OSPatching for the CMDB Item')]
        [string]$OSPatching,
        
        [Parameter(HelpMessage = 'Enter the Patch Schedule for the CMDB Item')]
        [string]$PatchSchedule,
        
        [Parameter(HelpMessage = 'Enter the Patch Notes for the CMDB Item')]
        [string]$PatchNotes,

        [Parameter(HelpMessage = 'Enter the Location Details for the CMDB Item')]
        [string]$LocationDetails,

        [Parameter(HelpMessage = 'Enter the GUID for the CMDB Item',
        Mandatory = $true)]
        [string]$Key,
        
        [Parameter(HelpMessage = 'Specifying Server',
            Mandatory = $false,
            DontShow = $true)]
        [string] $server = $(Connect-LANDesk)[1],
        [Parameter(HelpMessage = 'Specifying LanDesk Framework for api',
            Mandatory = $false,
            DontShow = $true)]
        [string] $framework = $(Connect-LANDesk)[2], 
        [Parameter(HelpMessage = 'Specifying LanDesk Headers for api',
            Mandatory = $false,
            DontShow = $true)]
        [hashtable] $Headers = $(Connect-LANDesk)[0]
    )
    
    begin {
    }
    
    process {
        [object[]]$Values = $null

        if($Name){
            $Title = @{}
            $Title.Name = "Title"
            $Title.Value = $Name
            [object[]]$Values += $Title
        }
        
        <# $_ConfigTypesCategory = @{}
        $_ConfigTypesCategory.Name = "_ConfigTypesCategory"
        $_ConfigTypesCategory.Value = '9dadd9f9-ca5d-4be6-93cc-6c8745fff615'
        $Values += $_ConfigTypesCategory #>

        if ($PO) {
            $_PO = @{}
            $_PO.Name = "_PO"
            $_PO.Value = $PO
            $Values += $_PO
        }
        
        # Look up table 
        if ($PhysicalLocation) {
            $Location = Search-LANDeskIssueLocation -Location $PhysicalLocation
            $_CILocation = @{}
            $_CILocation.Name = "_CILocation"
            $_CILocation.Value = $Location.Key
            $Values += $_CILocation
        }
        if ($AssetTag) {
            $_SHSAssetTag = @{}
            $_SHSAssetTag.Name = "_SHSAssetTag"
            $_SHSAssetTag.Value = $AssetTag
            $Values += $_SHSAssetTag
        }

        if ($RequestID) {
            $_RequestID = @{}
            $_RequestID.Name = "_RequestID"
            $_RequestID.Value = $RequestID
            $Values += $_RequestID
        }
        # Look up table
        if ($OperatingSystem) {
            if($OperatingSystem -match 'Windows 10'){
                $OS = '2ad72fd5-8d4e-4510-b5ea-f94b3a2cda08'
            }
            elseif ($OperatingSystem -match 'Windows 7') {
                $OS = 'f127ceee-074b-4cc1-8a71-f8c02a9a9bd1'
            }
            else {
                $OS = '00000000-0000-0000-0000-000000000000'
            }
            $_SHSOperatingSystem = @{}
            $_SHSOperatingSystem.Name = "_SHSOperatingSystem"
            $_SHSOperatingSystem.Value = $OS
            $Values += $_SHSOperatingSystem
        }

        if ($ChassisType) {
            if($ChassisType -match "Desktop" -or $ChassisType -match "SFF"){
                $ChassisGuid = 'c7f3c5ba-a8b3-40be-963f-7e1d75fb7fda'
            }
            elseif ($ChassisType -match "Micro") {
                $ChassisGuid = '8d71a4c3-ae9d-4e55-98ea-2f8a75987cac'                
            }
            elseif($ChassisType -match "Laptop"){
                $ChassisGuid = 'a8460b18-bab9-4c07-8fb1-a4cca4e63fa1'
            }
            elseif($ChassisType -match "Tablet"){
                $ChassisGuid = 'e6ae9cd4-9936-496d-8e5d-efce8417a3d0'
            }
            else{
                $ChassisGuid = '00000000-0000-0000-0000-000000000000'
            }
            $_SHSChassisType = @{}
            $_SHSChassisType.Name = "_SHSChasisRef"
            $_SHSChassisType.Value = $ChassisGuid
            $Values += $_SHSChassisType
        }

        if ($HDD) {
            $_HardDiskSize = @{}
            $_HardDiskSize.Name = "_HardDiskSize"
            $_HardDiskSize.Value = $HDD
            $Values += $_HardDiskSize
        }

        if ($RAM) {
            $_RAM = @{}
            $_RAM.Name = "_RAM"
            $_RAM.Value = $RAM
            $Values += $_RAM
        }

        if ($HDDAvail) {
            $_AvailableDiskSpace = @{}
            $_AvailableDiskSpace.Name = "_AvailableDiskSpace"
            $_AvailableDiskSpace.Value = $HDDAvail
            $Values += $_AvailableDiskSpace
        }
        
        if ($IPAddress) {
            $_IPAddress = @{}
            $_IPAddress.Name = "_IPAddress"
            $_IPAddress.Value = $IPAddress
            $Values += $_IPAddress
        }
        
        if ($Model) {
            $_Model = @{}
            $_Model.Name = "_Model"
            $_Model.Value = $Model
            $Values += $_Model
        }
        if ($SerialNumber) {
            $_SerialNumber = @{}
            $_SerialNumber.Name = "_SerialNumber"
            $_SerialNumber.Value = $SerialNumber
            $Values += $_SerialNumber
        }
        if ($Notes) {
            $_SHSCINotes = @{}
            $_SHSCINotes.Name = "_SHSCINotes"
            $_SHSCINotes.Value = $Notes
            $Values += $_SHSCINotes
        }
        # Look up table
        if ($OSPatching) {
            $Patch = Search-LANDeskOSPatchType -PatchType $OSPatching
            $_SHSOSPatching = @{}
            $_SHSOSPatching.Name = "_SHSOSPatching"
            $_SHSOSPatching.Value = $Patch.Key
            $Values += $_SHSOSPatching
        }
        #look up table
        if ($PatchSchedule) {
            $Schedule = Get-LANDeskPatchSchedule -PatchSchedule $PatchSchedule
            $_SHSPatchSchedule = @{}
            $_SHSPatchSchedule.Name = "_SHSPatchSchedule"
            $_SHSPatchSchedule.Value = $Schedule
            $Values += $_SHSPatchSchedule
        }
        if ($PatchNotes) {
            $_SHSPatchNotes = @{}
            $_SHSPatchNotes.Name = "_SHSPatchNotes"
            $_SHSPatchNotes.Value = $PatchNotes
            $Values += $_SHSPatchNotes
        }
        if ($LocationDetails){
            $LocationDetails
            $_SHSLocation3 = @{}
            $_SHSLocation3.Name = "_SHSLocation3"
            $_SHSLocation3.Value = $LocationDetails
            $Values += $_SHSLocation3    
        }

        $body =  [ordered]@{}
        $body.class_name = '_CMDBManagement.Call'
        $Body.originalValues = $Values
        $body.formValues = $Values 
        $body = $body | ConvertTo-Json

        $uri = 'http://' + $server + '/' + $framework + '/api/form?class_name=_CMDBManagement.Call&key=' + $Key + '&function_name=Edit&v=*'    
        Invoke-RestMethod -Uri $uri -Headers $headers -Body $Body -Method Patch

    }
    
    end {
    }
}