Functions/New-IAWidgetObject.ps1

Function New-IAWidgetObject{
    Param(
        [Parameter(Mandatory = $true, ParameterSetName='WidgetConf')]
        [Parameter(ParameterSetName='WidgetConf and Interactive')]
        $WidgetConfiguration,
        [Parameter(Mandatory = $true, ParameterSetName='WidgetConf')]
        $IAWidgetTemplate,
        [Parameter(Mandatory = $true, ParameterSetName='WidgetConf')]
        $IAGroup,
        [Parameter(Mandatory = $true, ParameterSetName='WidgetConf')]
        $IAWidgetType,
        [Parameter(ParameterSetName='Interactive')]
        [Parameter(ParameterSetName='WidgetConf and Interactive')]
        [Switch]$Interactive,
        [String]$Title,
        [String]$Subtitle,
        [Int]$RowIndex,
        [Int]$ColumnIndex
    )

    # Create empty widget object
    $IAWidgetObject = New-Object -TypeName PSObject

    if($Interactive){

        # Get nessessary data for a widget object
        Write-Output "Select a widget template." | Out-Null
        $IAWidgetTemplate = Get-IAWidgetTemplate -All | Out-GridView -PassThru

        Write-Output "Select a group, where the widget shall be created." | Out-Null
        $IAGroup = Get-IAGroup -All | Out-GridView -PassThru

        Write-Output "Select a type for the widget." | Out-Null
        $IAWidgetType = Get-IAWidgetType -All | Out-GridView -PassThru
    }

    # Make sure only one group is taken
    $IAGroup = $IAGroup | Select-Object -First 1

    # Creating a Task Schedule
    Write-Output "Creating a Task Schedule." | Out-Null
    $IATaskScheduleObject = New-IATaskScheduleObject -Interval 60 #Default value: 60
    $IATaskSchedule = New-IATaskSchedule -IATaskSchedule $IATaskScheduleObject -Passthru

    # TODO: WITH UPCOMING CHANGES IN MULTIPLE CONNECTORS, MAKE NESSESSARY CHANGES HERE
    # Getting primary Connector Id
    $IAConnector = Get-IAConnector -All | Where-Object {$_.Enabled -eq 'True' -and $_.Name -eq 'Configuration Manager'}

    # Getting a Connector Module Id for the selected Widget Template
    Write-Output "Getting the Connector Module Id" | Out-Null
    $IAConnectorModule = Get-IAConnectorModule -All | 
                            Where-Object {$_.ConnectorModuleTypeId -like "$($IAwidgetTemplate.ConnectorModuleTypeId)" -and $_.ConnectorId -eq $IAConnector.Id}
    
    $IAConfigurationId = $WidgetConfiguration.Id
    $IAWidgetConfiguration = $null
    $IAWidgetConfiguration = $WidgetConfiguration
    # Remove unnessessary fields that we dont need.
    $IAWidgetConfiguration.PSObject.Properties.Remove('@odata.context')
    $IAWidgetConfiguration.PSObject.Properties.Remove('CreatedDate')
    $IAWidgetConfiguration.PSObject.Properties.Remove('Id')
    $IAWidgetConfiguration.PSObject.Properties.Remove('CreatedBy')
    $IAWidgetConfiguration.PSObject.Properties.Remove('LastUpdated')
    $IAWidgetConfiguration.PSObject.Properties.Remove('LastUpdatedBy')
    $IAWidgetConfiguration | Add-Member -MemberType NoteProperty -Name '@odata.type' -Value "#IA_Backend.Entities.DataDefinitions.ConfigMgr.$($IAConnectorModule.Name)Configuration" -Force

    # Creating a DataDefinition for the Widget
    Write-Output "Creating the DataDefinition" | Out-Null
    $IADataDefinitionObject = New-IADataDefinitionObject -IAWidgetConfiguration $IAWidgetConfiguration -IATaskScheduleId $IATaskSchedule.Id -IAConnectorModuleId $IAConnectorModule.Id
    $IADataDefinition = New-IADataDefinition -IADataDefinitionObject $IADataDefinitionObject -Passthru

    # Set the correct ConfigurationId
    $IADataDefinition.ConfigurationId = $IAConfigurationId
    Set-IADataDefinition -IADataDefinition $IADataDefinition

    $IAWidgetDataValueFieldMaps = Get-IAWidgetDataValueFieldMaps -WidgetTemplateId $IAWidgetTemplate.Id |
        Select-Object -ExpandProperty WidgetDataValueFieldMaps

    # Set the WidgetType object
    switch($IAWidgetType.Name){

        {$_ -in "Bar", "Pie", 'List'} {

            $IAWidgetConfigurationDonutObject = New-IAWidgetConfigurationDonutObject
            $IAWidgetConfigurationObject = New-IAWidgetConfigurationDonut -IAWidgetConfigurationDonutObject $IAWidgetConfigurationDonutObject -Passthru
        }
        {$_ -eq "History"} {

            $IAWidgetConfigurationHistoriesObject = New-IAWidgetConfigurationHistoriesObject -ChartType "line" `
                -PeriodType "Entire Period" `
                -PeriodSlidingType "Rolling" `
                -PeriodValue 1 `
                -HistoryUnit "Month(s)" `
                -PeriodFixedStartDateTime "2009-12-31T22:00:00.000Z" `
                -PeriodFixedEndDateTime "2098-12-31T22:00:00.000Z"
               
            $IAWidgetConfigurationObject = New-IAWidgetConfigurationHistories -IAWidgetConfigurationHistories $IAWidgetConfigurationHistoriesObject -Passthru
        }
        {$_ -eq "Donut"}{

            $IAWidgetCenterLabelDataField = $IAWidgetDataValueFieldMaps | Where-Object -Property Default -eq $true | Select-Object -First 1

            if($IAWidgetCenterLabelDataField.Count -eq 0){

                $IAWidgetCenterLabelDataField = $IAWidgetDataValueFieldMaps | Select-Object -First 1
            }

            $IAWidgetConfigurationDonutObject = New-IAWidgetConfigurationDonutObject -CenterLabelDataFieldName $IAWidgetCenterLabelDataField.DataValueFieldName -ShowCenterSubTitle $true -ShowCenterPercentage $true
            $IAWidgetConfigurationObject = New-IAWidgetConfigurationDonut -IAWidgetConfigurationDonutObject $IAWidgetConfigurationDonutObject -Passthru
        }
        {$_ -eq "Text"}{

            if($IAConnectorModule.Name -eq 'ClientHealth'){
            
                #TODO: Make a function to generate the RawContent automatically
                $RawContent = "<br/>Healthy: {HealthyClientCount}<br/>Unhealthy: {UnhealthyClientCount}<br/>"
                $IAWidgetConfigurationTextObject = New-IAWidgetConfigurationTextObject -RawContent $RawContent
                $IAWidgetConfigurationObject = New-IAWidgetConfigurationText -IAWidgetConfigurationTextObject $IAWidgetConfigurationTextObject -Passthru
            }
        }
    }

    if([String]::IsNullOrEmpty($Title)) { $Title = $IAWidgetTemplate.Name }

    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'Title' -Value $Title
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'ConnectorModuleTypeId' -Value $IAWidgetTemplate.ConnectorModuleTypeId
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'Enabled' -Value $True
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'WidgetTemplateId' -Value $IAWidgetTemplate.Id
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'GroupId' -Value $IAGroup.Id
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'WidgetTypeId' -Value $IAWidgetType.Id
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'DataDefinitionId' -Value $IADataDefinition.Id
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'WidgetConfigurationBaseId' -Value $IAWidgetConfigurationObject.Id
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'SubTitle' -Value $Subtitle
    $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'HyperlinkUri' -Value $null

    if($RowIndex -ge 0) { $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'RowIndex' -Value $RowIndex }
    if($ColumnIndex -ge 0) { $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'ColumnIndex' -Value $ColumnIndex }
    else{

        $ColumnIndex = Get-IAWidget -All | 
            Where-Object -Property GroupId -eq $IAGroup.Id | 
            Select-Object -ExpandProperty ColumnIndex | 
            Sort-Object -Descending | 
            Select-Object -First 1 

        $ColumnIndex += 1
        $IAWidgetObject | Add-Member -MemberType NoteProperty -Name 'ColumnIndex' -Value $ColumnIndex
    }

    return $IAWidgetObject
}