src/Private/SharePoint/Add-NewTenant.ps1

$environments = "Production", "PPE", "China", "Germany", "USGovernment", "USGovernmentHigh", "USGovernmentDoD", "BleuCloud", "DelosCloud", "GovSGCloud", "Custom"
function Add-NewTenant {
    param (
        [Parameter(Mandatory = $true)]
        $settingsFilePath
    )
    try {
        $settings = Get-Content $settingsFilePath | ConvertFrom-Json
        Write-Host "No tenant found. Please add a new tenant."
        $newTenantName = Read-Host "Enter the tenant name"
        $newTenantId = Read-Host "Enter the tenant ID"
        $newTenantRootHost = Read-Host "Enter the tenant host (contoso.sharepoint.com)"
        $newClientId = Read-Host "Enter the client id"
        
        $normalizedRootHost = (($newTenantRootHost -replace "^https?://", "") -split "/")[0].Trim()
        $tenantName = ($normalizedRootHost -replace "(?i)(?:-admin|-my)?\.sharepoint\..*$", "").TrimEnd('.', '/')
        $tld = if ($normalizedRootHost -match "(?i)sharepoint\.(.+)$") { "sharepoint.$($Matches[1])" } else { "sharepoint.com" }
        
        $x = 0
        $environments | ForEach-Object { 
            Write-Host "$($x). $_"
            $x++
        }

        $environment = Read-Host "Enter the environment (0-$($environments.Count - 1))"
        if ((-not $environment) -or ($environment  -lt 0 -or $environment -ge $environments.Count)) {
            $environment = 0
        }
        $newTenant = @{
            id          = ($settings.SharePoint.Count).ToString()
            name        = $newTenantName
            tenantId    = $newTenantId
            url         = @("$($tenantName).$tld", "$($tenantName)-admin.$tld", "$($tenantName)-my.$tld")
            clientId    = $newClientId
            environment = $environments[$environment]
        }

        $settings.SharePoint += $newTenant
        $settings | ConvertTo-Json -Depth 3 | Set-Content -Path $settingsFilePath
        Write-Host "Tenant added successfully"
        Write-Host ""
    } catch {
        Write-Host "An error occurred: $_"
        throw $_
    }
}

function Remove-Tenant {
    param (
        [Parameter(Mandatory = $true)]
        $settingsFilePath
    )
    $settings = Get-Content $settingsFilePath | ConvertFrom-Json
    $tenantId = Read-Host "Enter Tenant ID to remove"

    $confirmVal = Read-Host "Are you sure you want to remove the tenant $($settings.SharePoint[$tenantId].name)? (y/n)"
    if ($confirmVal.ToLower() -eq 'y') {
        $x = 0
        $settings.SharePoint = $settings.SharePoint | Where-Object { $_.id -ne $tenantId.ToString() }
        $settings.SharePoint | ForEach-Object {
            $_.id = $x.ToString()
            $x++
        }
        $settings | ConvertTo-Json -Depth 3 | Set-Content -Path $settingsFilePath
        Write-Host "Tenant removed successfully"
    }
    else {
        Write-Host "Action Cancelled"
    }
}

function Update-Tenant {
    param (
        [Parameter(Mandatory = $true)]
        $settingsFilePath
    )
    $settings = Get-Content $settingsFilePath | ConvertFrom-Json
    $tenantId = Read-Host "Enter Tenant ID to update"
    Write-Host -ForegroundColor Yellow "Leave blank to keep the existing value"
    $newTenantName = Read-Host "Enter the tenant name ($($settings.SharePoint[$tenantId].name))"
    $newTenantAdminHost = Read-Host "Enter the tenant admin host ($($settings.SharePoint[$tenantId].url[0]))"
    $newTenantRootHost = Read-Host "Enter the tenant root host ($($settings.SharePoint[$tenantId].url[1]))"
    $newClientId = Read-Host "Enter the client id ($($settings.SharePoint[$tenantId].clientId))"

    $confirmVal = Read-Host "Are you sure you want to update the tenant $($settings.SharePoint[$tenantId].name)? (y/n)"
    if ($confirmVal.ToLower() -eq 'y') {
        $settings.SharePoint[$tenantId].name = if ($newTenantName) { $newTenantName } else { $settings.SharePoint[$tenantId].name }
        $settings.SharePoint[$tenantId].url[0] = if ($newTenantAdminHost) { $newTenantAdminHost } else { $settings.SharePoint[$tenantId].url[0] }
        $settings.SharePoint[$tenantId].url[1] = if ($newTenantRootHost) { $newTenantRootHost } else { $settings.SharePoint[$tenantId].url[1] }
        $settings.SharePoint[$tenantId].clientId = if ($newClientId) { $newClientId } else { $settings.SharePoint[$tenantId].clientId }


        $settings | ConvertTo-Json -Depth 3 | Set-Content -Path $settingsFilePath
        Write-Host "Tenant updated successfully"
    }
    else {
        Write-Host "Action Cancelled"
    }
}