<#
.SYNOPSIS
    A short one-line action-based description, e.g. 'Tests if a function is valid'
.DESCRIPTION
    A longer description of the function, its purpose, common use cases, etc.
.NOTES
    Information or caveats about the function e.g. 'This function is not supported in Linux'
.LINK
    Specify a URI to a help page, this will show when Get-Help -Online is used.
.EXAMPLE
    Test-MyTestFunction -Verbose
    Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
#>

function Set-ITDVMwareHostMaintenance {
    [CmdletBinding()]
    param (
        [Parameter(ParameterSetName = 'Enclosure', Mandatory = $true)]
        [string]
        $EnclosureName,

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

        [ValidateSet('Maintenance', 'Online', 'Connected')]
        [string]
        $State
    )
    
    begin {
        
    }
    
    process {

        switch ($PSCmdlet.ParameterSetName) {
            'Enclosure' {
                Write-Verbose "Setting all VMHosts in enclosure $EnclosureName to $State mode."
                try {
                    $VMHostName = (Get-OVServer | Where-Object Name -like $EnclosureName -ErrorAction Stop).ServerName
                }
                catch {
                    Write-Error "Failed to retrieve enclosure $EnclosureName. Error: $_"
                    throw
                }
            }
            'Manual' {
                Write-Verbose "Setting specified VMHosts to $State mode."
            }
        }

        switch ($State) {
            'Maintenance' {
                Write-Verbose "Setting VMHost $VMHostName to Maintenance mode."
                try {
                    Get-VMHost -Name $VMHostName | Set-VMHost -State Maintenance -Confirm:$false -RunAsync
                    Disable-ITDVMwareVMHostFeature -Name $VMHostName -AlarmActions
                }
                catch {
                    Write-Error "Failed to set VMHost $VMHostName to Maintenance mode.  Error: $_"
                    throw
                }
            }
            'Online' {
                Write-Verbose "Setting VMHost $VMHostName to Online mode."
                Get-VMHost -Name $VMHostName | Set-VMHost -State Connected -Confirm:$false -RunAsync
                Enable-ITDVMwareVMHostFeature -Name $VMHostName -AlarmActions
            }
        }
    }
    
    end {
        
    }
}