functions/DiskSmartInfo.functions.predicates.ps1

function isAttributeDataEqual
{
    Param (
        $attributeData,
        $attributeHistoricalData
    )

    if ($attributeData.Count -eq $attributeHistoricalData.Count)
    {
        if ($attributeData.Count -eq 1)
        {
            return $attributeData -eq $attributeHistoricalData
        }
        elseif ($attributeData.Count -gt 1)
        {
            for ($i = 0; $i -lt $attributeData.Count; $i++)
            {
                if ($attributeData[$i] -ne $attributeHistoricalData[$i])
                {
                    return $false
                }
            }
            return $true
        }
    }
    return $false
}

function isAttributeRequested
{
    Param (
        [hashtable[]]$RequestedAttributes,
        [System.Collections.Specialized.OrderedDictionary]$attributeSmartData,
        [string]$diskType
    )

    if ($diskType -eq 'ATA')
    {
        if ((-not ($RequestedAttributes.AttributeIDs -or $RequestedAttributes.AttributeIDHexes -or $RequestedAttributes.AttributeNames)) -or
            ($RequestedAttributes.AttributeIDs -contains $attributeSmartData.ID) -or
            ($RequestedAttributes.AttributeIDHexes -contains $attributeSmartData.IDHex) -or
            ($RequestedAttributes.AttributeNames.Where{$attributeSmartData.Name -like $PSItem}))
        {
            return $true
        }
        else
        {
            return $false
        }
    }

    elseif ($diskType -eq 'NVMe')
    {
        if ((-not $RequestedAttributes.AttributeNames) -or
            ($RequestedAttributes.AttributeNames.Where{$attributeSmartData.Name -like $PSItem}))
        {
            return $true
        }
        else
        {
            return $false
        }
    }
}

function isCritical
{
    Param (
        [PSCustomObject[]]$actualAttributesList,
        [System.Collections.Specialized.OrderedDictionary]$attributeSmartData,
        [string]$diskType
    )

    if ($diskType -eq 'ATA')
    {
        if ($actualAttributesList.Where{$_.AttributeID -eq $attributeSmartData.ID}.IsCritical)
        {
            return $true
        }
        else
        {
            return $false
        }
    }
    elseif ($diskType -eq 'NVMe')
    {
        if ($actualAttributesList.Where{$_.AttributeName -eq $attributeSmartData.Name}.IsCritical)
        {
            return $true
        }
        else
        {
            return $false
        }
    }
}

function isCriticalThresholdExceeded
{
    Param (
        [PSCustomObject[]]$actualAttributesList,
        [System.Collections.Specialized.OrderedDictionary]$attributeSmartData,
        [string]$diskType
    )

    if ($diskType -eq 'ATA')
    {
        if ((isCritical -actualAttributesList $actualAttributesList -attributeSmartData $attributeSmartData -diskType $diskType) -and
            ($attributeSmartData.Data -gt $actualAttributesList.Where{$_.AttributeID -eq $attributeSmartData.ID}.CriticalThreshold))
        {
            return $true
        }
        else
        {
            return $false
        }
    }
    elseif ($diskType -eq 'NVMe')
    {
        if ((isCritical -actualAttributesList $actualAttributesList -attributeSmartData $attributeSmartData -diskType $diskType) -and
            ($actualAttributesList.Where{$_.AttributeName -eq $attributeSmartData.Name}.IsCritical.Invoke($attributeSmartData.Data)))
        {
            return $true
        }
        else
        {
            return $false
        }
    }
}

function isValueThresholdExceeded
{
    Param (
        $Value,
        $Threshold
    )

    if ($Value -lt $Threshold)
    {
        return $true
    }
    else
    {
        return $false
    }
}

function isDiskNumberMatched
{
    Param (
        [int]$Index
    )

    if ($DiskNumbers -contains $Index)
    {
        return $true
    }
    else
    {
        return $false
    }
}

function isDiskModelMatched
{
    Param (
        [string]$Model
    )

    foreach ($dm in $DiskModels)
    {
        if ($Model -like $dm)
        {
            return $true
        }
    }
    return $false
}

function isDeviceMatched
{
    Param (
        [string]$Device
    )

    foreach ($de in $Devices)
    {
        if ($Device -like $de)
        {
            return $true
        }
    }
    return $false
}