DSCResources/MSFT_xWaitForAvailabilityGroup/MSFT_xWaitForAvailabilityGroup.psm1

$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path
Write-Verbose -Message "CurrentPath: $currentPath"

# Load Common Code
Import-Module $currentPath\..\..\xSQLServerHelper.psm1 -Verbose:$false -ErrorAction Stop

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Name,
        
        [UInt64] $RetryIntervalSec = 10,
        [UInt32] $RetryCount = 50
    )

    @{
        Name = $Name
        RetryIntervalSec = $RetryIntervalSec
        RetryCount = $RetryCount
    }
}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [System.UInt64]
        $RetryIntervalSec =20,

        [System.UInt32]
        $RetryCount = 6
    )

    $AGFound = $false
    New-VerboseMessage -Message "Checking for Availaibilty Group $Name ..."

    for ($count = 0; $count -lt $RetryCount; $count++)
    {
        try
        {
            $clusterGroup = Get-ClusterGroup -Name $Name -ErrorAction Ignore

            if ($clusterGroup -ne $null)
            {
                New-VerboseMessage -Message "Found Availability Group $Name"
                $AGFound = $true
                Start-Sleep -Seconds $RetryIntervalSec
                break;
            }
            
        }
        catch
        {
             New-VerboseMessage -Message "Availability Group $Name not found. Will retry again after $RetryIntervalSec sec"
        }
            
        New-VerboseMessage -Message "Availability Group $Name not found. Will retry again after $RetryIntervalSec sec"
        Start-Sleep -Seconds $RetryIntervalSec
    }

    if (! $AGFound)
    {
        throw "Availability Group $Name not found after $count attempts with $RetryIntervalSec sec interval"
        Exit
    }


}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Name,

        [System.UInt64]
        $RetryIntervalSec = 10,

        [System.UInt32]
        $RetryCount = 50
    )

    New-VerboseMessage -Message "Checking for Availability Group $Name ..."

    try
    {

        $clusterGroup = Get-ClusterGroup -Name $Name -ErrorAction Ignore

        if ($clusterGroup -eq $null)
        {
            New-VerboseMessage -Message "Availability Group $Name not found"
            $false
        }
        else
        {
            New-VerboseMessage -Message "Found Availabilty Group $Name"
            $true
        }
    }
    catch
    {
        New-VerboseMessage -Message "Availability Group $Name not found"
        $false
    }
}


Export-ModuleMember -Function *-TargetResource