Classes/Main/PaCustomReport.Class.ps1

######################################## Enums #######################################
# Short Database Names
Enum ShortDatabase {
    trsum = 1
}

class PaCustomReport {
    [string]$Name
    [string]$Description
    [string]$Database
    [string]$FirstColumn
    [string[]]$Members
    [string]$TimeFrame
    [int]$EntriesShown
    [int]$Groups

    ###################################### Methods #######################################
    # invokeReportGetQuery
    [Xml] ToXml() {
        [xml]$Doc = New-Object System.Xml.XmlDocument
        $root = $Doc.CreateNode("element","reports",$null)
        
        # Start Entry Node
        $EntryNode = $Doc.CreateNode("element","entry",$null)
        $EntryNode.SetAttribute("name",$this.Name)

        # Start Type Node
        $TypeNode = $Doc.CreateNode("element","type",$null)

        # Start DatabaseNode
        $DatabaseShortName = $this.TranslateDatabaseName($this.Database,"short")
        $DatabaseNode = $Doc.CreateNode("element",$DatabaseShortName,$null)
        
        # aggregate-by propert (FirstColumn)
        $FirstColumnNode = $Doc.CreateNode("element",'aggregate-by',$null)
        $FirstColumnMemberNode = $Doc.CreateNode("element",'member',$null)
        $FirstColumnMemberNode.InnerText = $this.FirstColumn
        $FirstColumnNode.AppendChild($FirstColumnMemberNode)
        $DatabaseNode.AppendChild($FirstColumnNode)

        # value members
        $ValuesNode = $Doc.CreateNode("element",'values',$null)
        foreach ($m in $this.Members) {
            $MemberNode = $Doc.CreateNode("element",'member',$null)
            $MemberNode.InnerText = $m
            $ValuesNode.AppendChild($MemberNode)
        }
        $DatabaseNode.AppendChild($ValuesNode)
        
        # add Database to type
        $TypeNode.AppendChild($DatabaseNode)

        # Add Type to Entry Node
        $EntryNode.AppendChild($TypeNode)

        # Create/Add TimeFrame to Entry
        $TimeFrameNode = $Doc.CreateNode("element",'period',$null)
        $TimeFrameNode.InnerText = $this.TimeFrame
        $EntryNode.AppendChild($TimeFrameNode)

        # Create/Add EntriesShown to Entry
        $EntriesShownNode = $Doc.CreateNode("element",'topn',$null)
        $EntriesShownNode.InnerText = $this.EntriesShown
        $EntryNode.AppendChild($EntriesShownNode)

        # Create/Add Groups to Entry
        $GroupsNode = $Doc.CreateNode("element",'topm',$null)
        $GroupsNode.InnerText = $this.Groups
        $EntryNode.AppendChild($GroupsNode)

        # Create/Add Description to Entry
        $GroupsNode = $Doc.CreateNode("element",'description',$null)
        $GroupsNode.InnerText = $this.Description
        $EntryNode.AppendChild($GroupsNode)

        # Append Entry to Root and Root to Doc
        $root.AppendChild($EntryNode)
        $Doc.AppendChild($root)

        return $Doc
    }

    # Translate Database strings
    [string] TranslateDatabaseName([string]$Name,[string]$DesiredType) {
        $DatabaseTranslations = @{}
        $DatabaseTranslations.trsum = "Traffic Summary"

        $TranslatedName = $null
        if (($DatabaseTranslations.Keys -contains $Name) -and ($DesiredType -eq "Friendly")) {
            $TranslatedName = $DatabaseTranslations.$Name
        } elseif (($DatabaseTranslations.Values -contains $Name) -and ($DesiredType -eq "Short")) {
            $TranslatedName = $DatabaseTranslations.Keys | Where-Object { $DatabaseTranslations["$_"] -eq $Name }
        } else {
            Throw "Invalid Database Name: $Name"
        }

        return $TranslatedName
    }

    ##################################### Initiators #####################################
    # Initiator
    PaCustomReport([string]$Name) {
        $this.Name = $Name
    }
}