[CmdletBinding()]
param (
    [Parameter(Mandatory = $false)]
    [object]
    $WebhookData
)

If ($WebhookData) {
    If ($WebhookData.RequestHeader.ITD -eq 'vBxbnq2g9M7cQJtFN3iGU4kD4pPJaSEgC5HML5ZuZk6wKfZQrpj2XfuQ5s') {
        Write-Verbose "Header has required data"
    }
    Else {
        Write-Error "Header missing required data"
        exit;
    }

    $InputParams = (ConvertFrom-Json -InputObject $WebhookData.RequestBody)
    $vCenterCredential = Get-AutomationPSCredential -Name 'VMware Auto' 
    $SharePointCredential = Get-AutomationPSCredential -Name 'SharePoint IaaS ReadWrite'

    Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -ParticipateInCeip $false -Confirm:$false   
    Connect-VIServer -Server itdvmvc1.nd.gov, itdvmvc2.nd.gov -Credential $vCenterCredential

    $VMName = $InputParams.HostName
    $Id = $InputParams.Id
    $Duration = $InputParams.Duration

    $VM = Get-VM -Name $VMName | where-object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
    If (@($VM).count -eq 2) { $VM = Get-VM -Name $VMName -Server ($global:DefaultVIServers | sort-object Name | select -first 1).Name }

    switch ($Duration) {
        {$Duration -ge 1 -and $Duration -le 7}
            {
                Write-Verbose "Duration = Snapshot"
                $VMSnapshots = $VM | Get-Snapshot | where-object Description -like "AutoSnap_$Id*"

                If (@($VMSnapshots).count -eq 1) {
                    Write-Verbose "Exactly one snapshot match found"
                    $Taken = $true
                    $VMSnapshot = $VMSnapshots
                    $Task = ((Get-View ((Get-View ScheduledTaskManager).ScheduledTask)).info | where-object Description -like "AutoSnap_$Id*")
                }
                else {
                    if (@($VMSnapshots | where-object Description -like "AutoSnap_$Id*").count -gt 1) {
                        Write-Error "More than one snapshot match found, abort"
                        Exit
                    }
                    else { Write-Verbose "Snapshot Id #$Id match not found on $VMName" }
                }
            }
        {$Duration -ge 8}
            {
                Write-Verbose "Duration = Clone"
                $VMClones = Get-VM | Where-Object Name -eq ($VMName + "_AutoClone_" + $Id)

                If (@($VMClones).count -eq 1) {
                    Write-Verbose "Exactly one clone match found"
                    $Taken = $true
                    $VMClone = $VMClones
                    $Task = ((Get-View ((Get-View ScheduledTaskManager).ScheduledTask)).info | where-object Description -like "AutoClone_$Id*")
                }
                else {
                    if (@($VMClones).count -gt 1) {
                        Write-Error "More than one VM clone match found, abort"
                        Exit
                    }
                    else { Write-Verbose "Clone Id #$Id match not found for $VMName" }
                }
            }
        Default {
            Write-Error "Duration less than zero."
        }
    }
                    
    If ($Taken -eq $true) {
        write-verbose "Updating SharePoint fields named Status and SnapshotTaken"
        $UrlContextInfo = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/contextinfo"
        $InvokeWebRequestParams = @{
            Uri             = $UrlContextInfo;
            Method          = "Post";
            UseBasicParsing = $true;
            Credential      = $SharePointCredential;
        }
        $RequestDigest = Invoke-RestMethod @InvokeWebRequestParams
        $RequestDigest = $RequestDigest.GetContextWebInformation.FormDigestValue
                
        $UrlList = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')"
        $InvokeWebRequestParams = @{
            Uri             = $UrlList;
            UseBasicParsing = $true;
            Credential      = $SharePointCredential;
        }
        $List = Invoke-RestMethod @InvokeWebRequestParams
        $ListItemEntityTypeFullName = $list.entry.content.properties.ListItemEntityTypeFullName
            
        $UrlListItem = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')/items" + '?$top=10000'
        $InvokeWebRequestParams = @{
            Uri             = $UrlListItem;
            Method          = "Get";
            UseBasicParsing = $true;
            Headers         = @{ "Accept" = "application/json;odata=verbose" };
            Credential      = $SharePointCredential
        }
        $ListItems = ((Invoke-WebRequest @InvokeWebRequestParams) -creplace '"Id":', '"Idx":' | ConvertFrom-Json).d.results
                
        $header = @{
            "accept"          = "application/json;odata=verbose"
            "X-RequestDigest" = $RequestDigest
            "IF-MATCH"        = '*'
            "X-HTTP-Method"   = "MERGE"
        }
            
        $RecordToModify = $ListItems | Where-Object Id -eq $InputParams.Id
        If (@($RecordToModify).count -gt 1) { Write-Error "More than one record, stopping"; break }
        $IDtoModify = $RecordToModify.ID
            
        $UrlItem = "https://testshare.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VMware-Snapshots')/items($IDtoModify)"
        $InvokeWebRequestParams = @{
            Uri             = $UrlItem;
            Method          = "Get";
            Headers         = @{ "Accept" = "application/json;odata=verbose" }
            UseBasicParsing = $true;
            Credential      = $SharePointCredential
        }
        
        [PSCustomObject]$SetRecord = @{
            "__metadata"  = @{type = $ListItemEntityTypeFullName };
            Status        = 'Taken';
            SnapshotTaken = $Task.PrevRunTime;
            AutoExpire    = ($Task.Description -split '[\r\n]+')[1].split('_')[1];
            AutoDelete    = ($Task.Description -split '[\r\n]+')[2].split('_')[1];
        }
            
        $body = $SetRecord | ConvertTo-Json
        $InvokeWebRequestParams = @{
                    
            Uri             = $UrlItem;
            Method          = "Post";
            Body            = $body;
            ContentType     = "application/json;odata=verbose";
            Headers         = $header;
            UseBasicParsing = $true;
            Credential      = $SharePointCredential;
        }
        Invoke-RestMethod @InvokeWebRequestParams

        Disconnect-VIServer * -Confirm:$false
    }
     
}
else {
    Write-Error "Runbook must be started from webhook"
}