DSCResources/MSFT_OfficeOnlineServerMachine/MSFT_OfficeOnlineServerMachine.psm1

data LocalizedData
{
    # culture="en-US"
    ConvertFrom-StringData -StringData @'
NotApartOfAFarm = It does not appear that this machine is part of an Office Online Server/Office Web Apps farm.
ChangingAppMachineConfig = Changing App Maching Configuration.
SetAppMachine = The Office Web App Machine has been Set.
RemoveAppMachine = The Office Web App Machine has been removed.
FailedRemove = Failed to remove the Web App Machine.
'@

}

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure = "Present",

        [System.String[]]
        $Roles,

        [parameter(Mandatory = $true)]
        [System.String]
        $MachineToJoin
    )


    Import-Module -Name OfficeWebApps -ErrorAction Stop

    $officeWebAppsMachine = $null

    try
    {
        $officeWebAppsMachine = Get-OfficeWebAppsMachine
    }
    catch
    {
        # catch when not a part of the farm and redirect output to returned hash table
        $notInFarmError = "It does not appear that this machine is part of an " + `
                          "(Office Online)|(Office Web Apps) Server farm\."
        if($_.toString() -match $notInFarmError)
        {
            Write-Verbose -Message $LocalizedData.NotApartOfAFarm
        }
        else
        {
            throw
        }
    }

    if ($null -eq $officeWebAppsMachine)
    {
        $returnValue = @{
            Ensure = "Absent"
            Roles = $null
            MachineToJoin = $null
        }
    }
    else
    {
        $returnValue = @{
            Ensure = "Present"
            Roles = [System.String[]]$officeWebAppsMachine.Roles
            MachineToJoin = [System.String]$officeWebAppsMachine.MasterMachineName
        }
    }

    return $returnValue
}

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure = "Present",

        [System.String[]]
        $Roles,

        [parameter(Mandatory = $true)]
        [System.String]
        $MachineToJoin
    )

    Write-Verbose -Message "Updating settings for local Office Online Server"
    Import-Module -Name OfficeWebApps -ErrorAction Stop

    if ($Ensure -eq "Absent")
    {
        Remove-OfficeWebAppsMachine

        Write-Verbose -Message $LocalizedData.RemoveAppMachine 
    }
    else
    {
        # Due to issues with Set-OfficeWebAppsMachine not changing machine roles,
        # always remove the machine and re-add.

        try
        {
            Remove-OfficeWebAppsMachine -ErrorAction Stop
        }
        catch
        {
            Write-Verbose -Message $LocalizedData.FailedRemove
        }

        if ($null -eq $Roles)
        {
            $Roles = @("All")
        }             

        New-OfficeWebAppsMachine -MachineToJoin $MachineToJoin -Roles $Roles

        Write-Verbose -Message $LocalizedData.SetAppMachine
    }
}

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [ValidateSet("Present","Absent")]
        [System.String]
        $Ensure = "Present",

        [System.String[]]
        $Roles,

        [parameter(Mandatory = $true)]
        [System.String]
        $MachineToJoin
    )

    Write-Verbose -Message "Testing settings for local Office Online Server"
    $results = Get-TargetResource -MachineToJoin $MachineToJoin

    if ($null -eq $Roles)
    {
        $Roles = @("All")
    }

    if ($null -eq $results.Roles)
    {
        $roleCompare = $null
    }
    else 
    {
        $roleCompare = Compare-Object -ReferenceObject $results.Roles -DifferenceObject $Roles
    }
    
    if ($MachineToJoin.Contains(".") -eq $true)
    {
        $fqdn = $MachineToJoin
        $computer = $MachineToJoin.Substring(0, $MachineToJoin.IndexOf("."))
    }
    else 
    {
        $domain = (Get-CimInstance -ClassName Win32_ComputerSystem).Domain
        $fqdn = "$MachineToJoin.$domain"
        $computer = $MachineToJoin
    }

    if (($results.Ensure -eq "Present") `
            -and ($Ensure -eq "Present") `
            -and (($results.MachineToJoin -eq $fqdn) -or ($results.MachineToJoin -eq $computer)) `
            -and ( $null -eq $roleCompare))
    {
        # If present and all value match return true
        return $true
    }
    elseif(($results.Ensure -eq "Absent") -and ($Ensure -eq "Absent")) 
    {
        # if absent no need to check all values
        return $true
    }
    else
    {
        return $false
    }
}

Export-ModuleMember -Function *-TargetResource