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"
    }
}
# SIG # Begin signature block
# MIIHMAYJKoZIhvcNAQcCoIIHITCCBx0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD8J3VUVmy/dKjI
# jaMe/oWCEIN7elzZbsjuYZ8l5rtUf6CCBBwwggQYMIICgKADAgECAhBH6tQY1Crt
# r02dueiKibmNMA0GCSqGSIb3DQEBCwUAMCQxIjAgBgNVBAMMGU0zNjUuVG9vbGtp
# dCBDb2RlIFNpZ25pbmcwHhcNMjYwNzE2MTY1NjE0WhcNMjcwNzE2MTcwNjEzWjAk
# MSIwIAYDVQQDDBlNMzY1LlRvb2xraXQgQ29kZSBTaWduaW5nMIIBojANBgkqhkiG
# 9w0BAQEFAAOCAY8AMIIBigKCAYEAxQCBRWJ923yIy73AwGWtFvfBL/dZHvwCBO05
# dJopbkHGcCqifl9R21PXr5OIjcEFv16ObYL23cPwZaNKCiejuiU32MHwidYHU1k5
# AzFpjwW2uwjeA7Hip3cURwoeOH/LzNa/xNTBRiO70M7gunZCm+FixDcPKf66Tvb1
# iM6pbOFmJvzbGjFqKM6mQRofaCPU89SHW5y43HyZNdiWsJTN4TsWj96Rps4fKhh2
# gToexqi0GhLHhLtVQ8ZxMic6w0C9sCWhYBl3kw1OJdaa/MVBdVAXDOIL0HIG8jOa
# l1x67U1LihXEw1hdc3YabhvSYZ5ZXPV1AZ2z6+Qa0EL9XlJWqBkn0rO6sZB1IkOo
# gfeTxVuI6SjhqpW6QrAFFJzb81qd0dDWmmuVka1yoWEic7naZpDfuh3JZPOUilE1
# Wv3qhBDYN5qg1qXeh0RMosR8rMfKjE8CFvsB7LTibom+22in1x16vmIiv9ep5HNc
# eS0hRa/84+vmXQ8R6hN8x+oWbG8NAgMBAAGjRjBEMA4GA1UdDwEB/wQEAwIHgDAT
# BgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUu9RWiOCtUYtlrLgwzVDsor7P
# p88wDQYJKoZIhvcNAQELBQADggGBAKJksJX6tgjdng//9wRM2ztQn8breDnY/Zki
# 8iXrC94sqCYoYg1lT0pVHZq1ZHpdUNh/xQnjP9asbIqgUt0YiCIASCONV2nM2wyK
# VjrvxaC08xefuHiO/R6Uc9sDW38mID+gDoAmswmB9JV5qm+j8b4hw3vcwuUe3nla
# 5bn3YoKXLY4/YJjHNA62TmhYNfs7iwdk2vyH/dCvD35LdBhP/y2ChmOxzI1aSp4L
# c65zCFVDPzw1IED/5q9NM48QUVDgVAX6VNuocjXZpWd7fHf7KFLRJSExXtaYQCdk
# hBSITzd5WBT2opKF02TrTyc5h1zCTr6HU+1Eqr92fvEGfqk4yYSt4plyqbm6Unnq
# gEgwDqlgm9ZNA8hzorcoxSetVVZ8z+50KB55JRTENZ/5kOJWzPtoIA+PdmFvg3wU
# jQHhO6C32rdVUk+j1hI1zL6sR8gYn5VmLPVjfs49yKf+2t3iDsaYVRNawOqHrMZj
# g59c2M2hT5D6krLsI8r3F/t3YfHbKjGCAmowggJmAgEBMDgwJDEiMCAGA1UEAwwZ
# TTM2NS5Ub29sa2l0IENvZGUgU2lnbmluZwIQR+rUGNQq7a9Nnbnoiom5jTANBglg
# hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MC8GCSqGSIb3DQEJBDEiBCDm71YMc4UZbLcb/xzJTEV+eGc5Hv3m4Yp1Yk+rf9Fo
# lzANBgkqhkiG9w0BAQEFAASCAYB64eLP4gs0a0WYZwFt2Uf2V7DQEBYQeYbVy3KN
# NeEGM90TdMu2Ori+HV7ptZg3JqE2H9pz9Y1Uyki11TZQ2WJvIXDNVOIscb/oPIGM
# lxG7XuNQyzEt6wU1Nih2vTxhGQHFXGZIx5nY485CBSp5ZnCIxXoGJG6sgLJ7wnIW
# LIOZspjfTpU4sEzskhtkfgQgeicJ31lkmGt0TRipN6WZTDqlwbRbU5enGsR6lbJD
# pfoaGsLu9x8KxiY3gvGsyC7IaG5wzr/W4xzD9caIkZVt1rkh/V9AEU/0JPNZCUiH
# Iyz7m9qvoECk2o6T0PmdzxF4yLWEwKJBw4Zq/vj1uQsha8O4rB6Z1fPPsQz5D4pB
# qhLvHdDZUSPmDj7YK7KZIs4zNR1p4Tpbaatw5uFW08AJfX2X7bkgd+f/5sZtCM5B
# N3B9mk0e0ku0IRGar3bDOxqYss/Cw9VwbeHMGZRRYqmWDCzp+jiKUytvF0sZ4avq
# 8PmCPlaOz2TgLIq1P11kfF8p8rc=
# SIG # End signature block