public PsApiManagement CreateApiManagementService(
            string resourceGroupName,
            string serviceName,
            string location,
            string organization,
            string administratorEmail,
            Dictionary <string, string> tags,
            bool enableClientCertificate,
            PsApiManagementSku sku         = PsApiManagementSku.Developer,
            int?capacity                   = null,
            PsApiManagementVpnType vpnType = PsApiManagementVpnType.None,
            PsApiManagementVirtualNetwork virtualNetwork = null,
            PsApiManagementRegion[] additionalRegions    = null,
            PsApiManagementCustomHostNameConfiguration[] customHostnameConfigurations = null,
            PsApiManagementSystemCertificate[] systemCertificates = null,
            PsApiManagementSslSetting sslSettings = null,
            bool createSystemResourceIdentity     = false,
            string[] userAssignedIdentity         = null)
        {
            string skuType = Mappers.MapSku(sku);

            if (capacity == null)
            {
                capacity = (sku == PsApiManagementSku.Consumption ? 0 : 1);
            }

            var skuProperties = new ApiManagementServiceSkuProperties(skuType, capacity.Value);

            var parameters = new ApiManagementServiceResource
            {
                Location           = location,
                PublisherEmail     = administratorEmail,
                PublisherName      = organization,
                VirtualNetworkType = Mappers.MapVirtualNetworkType(vpnType),
                Sku  = skuProperties,
                Tags = tags
            };

            if (virtualNetwork != null)
            {
                parameters.VirtualNetworkConfiguration = new VirtualNetworkConfiguration
                {
                    SubnetResourceId = virtualNetwork.SubnetResourceId
                };
            }

            if (additionalRegions != null && additionalRegions.Any())
            {
                parameters.AdditionalLocations =
                    additionalRegions
                    .Select(region =>
                            new AdditionalLocation
                {
                    Location = region.Location,
                    Sku      = new ApiManagementServiceSkuProperties()
                    {
                        Name     = Mappers.MapSku(region.Sku),
                        Capacity = region.Capacity
                    },
                    VirtualNetworkConfiguration = region.VirtualNetwork == null
                                    ? null
                                    : new VirtualNetworkConfiguration
                    {
                        SubnetResourceId = region.VirtualNetwork.SubnetResourceId
                    }
                })
                    .ToList();
            }

            if (customHostnameConfigurations != null)
            {
                parameters.HostnameConfigurations = BuildHostNameConfiguration(customHostnameConfigurations);
            }

            if (systemCertificates != null)
            {
                parameters.Certificates = new List <CertificateConfiguration>();
                foreach (var systemCertificate in systemCertificates)
                {
                    var certificateConfig = systemCertificate.GetCertificateConfiguration();
                    parameters.Certificates.Add(certificateConfig);
                }
            }

            if (sslSettings != null)
            {
                parameters.CustomProperties = Mappers.MapPsApiManagementSslSetting(sslSettings);
            }

            if (enableClientCertificate)
            {
                parameters.EnableClientCertificate = enableClientCertificate;
            }

            parameters.Identity = Mappers.MapAssignedIdentity(createSystemResourceIdentity, userAssignedIdentity);

            var apiManagementResource = Client.ApiManagementService.CreateOrUpdate(resourceGroupName, serviceName, parameters);

            return(new PsApiManagement(apiManagementResource));
        }
        public PsApiManagement CreateApiManagementService(
            string resourceGroupName,
            string serviceName,
            string location,
            string organization,
            string administratorEmail,
            Dictionary <string, string> tags,
            bool enableClientCertificate,
            PsApiManagementSku sku         = PsApiManagementSku.Developer,
            int?capacity                   = null,
            PsApiManagementVpnType vpnType = PsApiManagementVpnType.None,
            PsApiManagementVirtualNetwork virtualNetwork = null,
            PsApiManagementRegion[] additionalRegions    = null,
            PsApiManagementCustomHostNameConfiguration[] customHostnameConfigurations = null,
            PsApiManagementSystemCertificate[] systemCertificates = null,
            PsApiManagementSslSetting sslSettings = null,
            bool createSystemResourceIdentity     = false,
            string[] userAssignedIdentity         = null,
            string[] zone       = null,
            bool?disableGateway = null,
            string minimalControlPlaneApiVersion = null,
            string publicNetworkAccess           = null,
            string publicIpAddressId             = null)
        {
            string skuType = Mappers.MapSku(sku);

            if (capacity == null)
            {
                capacity = (sku == PsApiManagementSku.Consumption ? 0 : 1);
            }

            var skuProperties = new ApiManagementServiceSkuProperties(skuType, capacity.Value);

            var parameters = new ApiManagementServiceResource
            {
                Location           = location,
                PublisherEmail     = administratorEmail,
                PublisherName      = organization,
                VirtualNetworkType = Mappers.MapVirtualNetworkType(vpnType),
                Sku  = skuProperties,
                Tags = tags
            };

            if (virtualNetwork != null)
            {
                parameters.VirtualNetworkConfiguration = new VirtualNetworkConfiguration
                {
                    SubnetResourceId = virtualNetwork.SubnetResourceId
                };
            }

            if (additionalRegions != null && additionalRegions.Any())
            {
                parameters.AdditionalLocations =
                    additionalRegions
                    .Select(region => region.GetAdditionalLocation())
                    .ToList();
            }

            if (customHostnameConfigurations != null)
            {
                parameters.HostnameConfigurations = BuildHostNameConfiguration(customHostnameConfigurations);
            }

            if (systemCertificates != null)
            {
                parameters.Certificates = new List <CertificateConfiguration>();
                foreach (var systemCertificate in systemCertificates)
                {
                    var certificateConfig = systemCertificate.GetCertificateConfiguration();
                    parameters.Certificates.Add(certificateConfig);
                }
            }

            if (sslSettings != null)
            {
                parameters.CustomProperties = Mappers.MapPsApiManagementSslSetting(sslSettings);
            }

            if (enableClientCertificate)
            {
                parameters.EnableClientCertificate = enableClientCertificate;
            }

            if (zone != null)
            {
                parameters.Zones = zone;
            }

            if (disableGateway != null && disableGateway.HasValue)
            {
                parameters.DisableGateway = disableGateway.Value;
            }

            if (!string.IsNullOrWhiteSpace(minimalControlPlaneApiVersion))
            {
                parameters.ApiVersionConstraint = new ApiVersionConstraint()
                {
                    MinApiVersion = minimalControlPlaneApiVersion
                };
            }

            if (publicIpAddressId != null)
            {
                parameters.PublicIpAddressId = publicIpAddressId;
            }

            if (publicNetworkAccess != null)
            {
                parameters.PublicNetworkAccess = publicNetworkAccess;
            }

            parameters.Identity = Mappers.MapAssignedIdentity(createSystemResourceIdentity, userAssignedIdentity);

            var apiManagementResource = Client.ApiManagementService.CreateOrUpdate(resourceGroupName, serviceName, parameters);

            return(new PsApiManagement(apiManagementResource));
        }