SecretManagement.NetwrixPasswordSecure.Extension/internal/functions/Initialize-NetwrixDefaultConfiguration.ps1

function Initialize-NetwrixDefaultConfiguration {
    [CmdletBinding()]
    param (
        [string] $VaultName,
        [parameter(mandatory = $true, ParameterSetName = "alreadyConnected")]
        [hashtable] $AdditionalParameters,
        [parameter(mandatory = $true, ParameterSetName = "alreadyConnected")]
        [PsrApi.PsrApi]$ExistingConnection
    )
    $AdditionalParameters = @{} + $AdditionalParameters
    $alreadyInitialized = Get-NetwrixPSFConfigValue -VaultName $VaultName -SubPath "ConfigInitialized"
    if ($alreadyInitialized) {
        Write-PSFMessage "Vault $VaultName already initialized"
        return
    }
    Write-PSFMessage "Initializing configuration for vault $VaultName"
    try {
        $metaData = Get-NetwrixMetaConfig -ExistingConnection $ExistingConnection
    }
    catch {
        Write-PSFMessage -Level Error "Could not create/query metadata $_" -Tag CONERR -ErrorRecord $_
        # Write-PSFMessage -Level Error "`$ExistingConnection=$($ExistingConnection|ConvertTo-Json -Compress -EnumsAsStrings)" -Tag CONERR
        throw "Could not create/query metadata"
    }
    #region Initialize password form mappings
    # Searching for a form mapping preConfig in Scope 'ServerDB' as a template. The final mapping will be stored for the vault itself.
    # If the initialization has been run before the mapping will exist
    $configSubPath = "FormMappings"
    $formMappingHash = Get-NetwrixPSFConfigValue -VaultName $VaultName -AdditionalParameters $AdditionalParameters -subPath $configSubPath -Scope ServerDB
    if ($null -eq $formMappingHash) {
        Write-PSFMessage "No Mapping found as PSFConfig, looking at additional Vault param"
        $formMappingHash = $AdditionalParameters.formMapping
    }
    if ($null -eq $formMappingHash) {
        Write-PSFMessage "No Mapping found as additional parameter, query Auto-Default"
        $formMappingHash = $metaData.formMapping
    }
    if ($null -eq $formMappingHash) {
        Write-PSFMessage "No password form mapping available" -Level Error
        throw "No password form mapping available"
    }
    Write-PSFMessage "Mapping found, Type $($formMappingHash.GetType())"
    if ($formMappingHash -is [String]) {
        Write-PSFMessage "Converting JSON String to HashTable"
        try {
            $formMappingHash = $formMappingHash | ConvertFrom-Json | ConvertTo-PSFHashtable
        }
        catch {
            Write-PSFMessage -Level Error "Could not convert json to HashTable"
            throw "Could not convert json to HashTable"
        }
    }
    $allForms = @() + $formMappingHash.Values
    foreach ($form in $allForms) {
        if (-not $formMappingHash.ContainsKey("$($form.id)")) { $formMappingHash."$($form.id)" = $form }
        if (-not $formMappingHash.ContainsKey("$($form.formname)")) { $formMappingHash."$($form.formname)" = $form }
    }
    Write-PSFMessage "Saving form mapping for later use: $($formMappingHash|ConvertTo-Json -Compress)"
    Set-NetwrixPSFConfigValue -VaultName $VaultName -AdditionalParameters $AdditionalParameters -subPath $configSubPath -Initialize -value $formMappingHash
    #endregion Initialize password form mappings

    #region Determin default OU
    # Searching for a form mapping preConfig in Scope 'ServerDB' as a template. The final mapping will be stored for the vault itself.
    # If the initialization has been run before the mapping will exist
    $configSubPath = "Default.OU"
    $defaultOUName = Get-NetwrixPSFConfigValue -VaultName $VaultName -AdditionalParameters $AdditionalParameters -subPath $configSubPath -Scope ServerDB
    if ($null -eq $defaultOUName) {
        Write-PSFMessage "No defaultOUName found as PSFConfig, looking at additional Vault param"
        $defaultOUName = $AdditionalParameters.defaultOUName
    }
    if ([string]::IsNullOrEmpty( $defaultOUName)) {
        Write-PSFMessage "No defaultOUName found as additional parameter, Create default"
        $defaultOUName = $metaData.organisationalUnits.Values | Sort-Object -Property type, name | Select-Object -ExpandProperty name -First 1
    }
    if ($null -eq $defaultOUName) {
        Write-PSFMessage "No defaultOUName available" -Level Error
        throw "No defaultOUName available"
    }
    Set-NetwrixPSFConfigValue -VaultName $VaultName -AdditionalParameters $AdditionalParameters -subPath $configSubPath -Initialize -value $defaultOUName
    #endregion Determin default OU

    #region Determin default Form
    # Searching for a form mapping preConfig in Scope 'ServerDB' as a template. The final mapping will be stored for the vault itself.
    # If the initialization has been run before the mapping will exist
    $configSubPath = "Default.Form"
    $defaultFormName = Get-NetwrixPSFConfigValue -VaultName $VaultName -AdditionalParameters $AdditionalParameters -subPath $configSubPath -Scope ServerDB
    if ($null -eq $defaultFormName) {
        Write-PSFMessage "No defaultFormName found as PSFConfig, looking at additional Vault param"
        $defaultFormName = $AdditionalParameters.defaultFormName
    }
    if ([string]::IsNullOrEmpty( $defaultFormName)) {
        Write-PSFMessage "No defaultFormName found as additional parameter, Create default"
        $formData = @() + $metaData.formMapping.Values
        $sortableForms = @()
        foreach ($formHash in $formData) {
            $formHash.fieldCount = $formHash.fields.Count
            $formHash.nameLength = $formHash.formName.Length
            $sortableForms += [PSCustomObject]$formHash
        }
        $sortableForms = $sortableForms | Where-Object secretType -eq 'pscredential' | Sort-Object -Property fieldCount, nameLength
        $defaultFormName = $sortableForms | Select-Object -ExpandProperty formname -First 1
    }
    if ($null -eq $defaultFormName) {
        Write-PSFMessage "No defaultFormName available" -Level Warning
    }
    Set-NetwrixPSFConfigValue -VaultName $VaultName -AdditionalParameters $AdditionalParameters -subPath $configSubPath -Initialize -value $defaultFormName
    #endregion Determin default Form
    Set-NetwrixPSFConfigValue -VaultName $VaultName -SubPath "ConfigInitialized" -Value $true
}