internal/functions/transformers/ConvertTo-SldgEntraIdGroup.ps1

function ConvertTo-SldgEntraIdGroup {
    <#
    .SYNOPSIS
        Transforms generated data rows into Microsoft Entra ID group objects.
    .DESCRIPTION
        Maps columns from generated DataTable rows to Entra ID group properties.
        Outputs objects compatible with Microsoft Graph API group creation payload.
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'MailDomain', Justification = 'Reserved for future mail address generation')]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [System.Data.DataTable]$Data,

        [hashtable]$ColumnMapping,

        [ValidateSet('Security', 'Microsoft365', 'DistributionList')]
        [string]$GroupType = 'Security',

        [string]$MailDomain = 'contoso.onmicrosoft.com'
    )

    # Auto-detect columns if no mapping provided
    if (-not $ColumnMapping) {
        $ColumnMapping = @{}
        $colNames = $Data.Columns | ForEach-Object { $_.ColumnName }

        foreach ($col in $colNames) {
            switch -Regex ($col) {
                '(?i)(name|group.?name|nazev|jmeno)' { if (-not $ColumnMapping['displayName']) { $ColumnMapping['displayName'] = $col } }
                '(?i)(description|popis)' { $ColumnMapping['description'] = $col }
                '(?i)(mail|email)' { $ColumnMapping['mail'] = $col }
                '(?i)(department|oddeleni)' { $ColumnMapping['department'] = $col }
            }
        }
    }

    foreach ($row in $Data.Rows) {
        $displayName = if ($ColumnMapping['displayName']) { $row[$ColumnMapping['displayName']] } else { "Group-$(Get-Random -Minimum 1000 -Maximum 9999)" }
        $description = if ($ColumnMapping['description'] -and $row[$ColumnMapping['description']] -isnot [DBNull]) {
            $row[$ColumnMapping['description']]
        } else { $null }

        $mailNickname = ($displayName -replace '[^a-zA-Z0-9]', '' -replace '\s+', '').ToLower()
        if ($mailNickname.Length -gt 64) { $mailNickname = $mailNickname.Substring(0, 64) }
        if (-not $mailNickname) { $mailNickname = "grp$(Get-Random -Minimum 1000 -Maximum 9999)" }

        $group = [SqlLabDataGenerator.EntraIdGroup]@{
            displayName   = $displayName
            mailNickname  = $mailNickname
            mailEnabled   = $GroupType -eq 'Microsoft365' -or $GroupType -eq 'DistributionList'
            securityEnabled = $GroupType -eq 'Security' -or $GroupType -eq 'Microsoft365'
            groupTypes    = switch ($GroupType) {
                'Microsoft365' { @('Unified') }
                default { @() }
            }
        }

        if ($description) {
            $group.Description = $description
        }

        # Add department tag if available
        if ($ColumnMapping['department'] -and $row[$ColumnMapping['department']] -isnot [DBNull]) {
            $group.Department = $row[$ColumnMapping['department']]
        }

        $group
    }
}