# coding=utf-8
# --------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# Code generated by Microsoft (R) AutoRest Code Generator.
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------

from copy import deepcopy
from typing import Any, Awaitable, Optional, TYPE_CHECKING, cast
from typing_extensions import Self

from azure.core.pipeline import policies
from azure.core.rest import AsyncHttpResponse, HttpRequest
from azure.core.settings import settings
from azure.mgmt.core import AsyncARMPipelineClient
from azure.mgmt.core.policies import AsyncARMAutoResourceProviderRegistrationPolicy
from azure.mgmt.core.tools import get_arm_endpoints

from .. import models as _models
from .._utils.serialization import Deserializer, Serializer
from ._configuration import CosmosDBManagementClientConfiguration
from .operations import (
    CassandraClustersOperations,
    CassandraDataCentersOperations,
    CassandraResourcesOperations,
    CollectionOperations,
    CollectionPartitionOperations,
    CollectionPartitionRegionOperations,
    CollectionRegionOperations,
    DatabaseAccountRegionOperations,
    DatabaseAccountsOperations,
    DatabaseOperations,
    FleetOperations,
    FleetspaceAccountOperations,
    FleetspaceOperations,
    GremlinResourcesOperations,
    LocationsOperations,
    MongoDBResourcesOperations,
    NotebookWorkspacesOperations,
    Operations,
    PartitionKeyRangeIdOperations,
    PartitionKeyRangeIdRegionOperations,
    PercentileOperations,
    PercentileSourceTargetOperations,
    PercentileTargetOperations,
    PrivateEndpointConnectionsOperations,
    PrivateLinkResourcesOperations,
    RestorableDatabaseAccountsOperations,
    RestorableGremlinDatabasesOperations,
    RestorableGremlinGraphsOperations,
    RestorableGremlinResourcesOperations,
    RestorableMongodbCollectionsOperations,
    RestorableMongodbDatabasesOperations,
    RestorableMongodbResourcesOperations,
    RestorableSqlContainersOperations,
    RestorableSqlDatabasesOperations,
    RestorableSqlResourcesOperations,
    RestorableTableResourcesOperations,
    RestorableTablesOperations,
    ServiceOperations,
    SqlResourcesOperations,
    TableResourcesOperations,
)

if TYPE_CHECKING:
    from azure.core import AzureClouds
    from azure.core.credentials_async import AsyncTokenCredential


class CosmosDBManagementClient:  # pylint: disable=too-many-instance-attributes
    """Azure Cosmos DB Database Service Resource Provider REST API.

    :ivar database_accounts: DatabaseAccountsOperations operations
    :vartype database_accounts: azure.mgmt.cosmosdb.aio.operations.DatabaseAccountsOperations
    :ivar operations: Operations operations
    :vartype operations: azure.mgmt.cosmosdb.aio.operations.Operations
    :ivar database: DatabaseOperations operations
    :vartype database: azure.mgmt.cosmosdb.aio.operations.DatabaseOperations
    :ivar collection: CollectionOperations operations
    :vartype collection: azure.mgmt.cosmosdb.aio.operations.CollectionOperations
    :ivar collection_region: CollectionRegionOperations operations
    :vartype collection_region: azure.mgmt.cosmosdb.aio.operations.CollectionRegionOperations
    :ivar database_account_region: DatabaseAccountRegionOperations operations
    :vartype database_account_region:
     azure.mgmt.cosmosdb.aio.operations.DatabaseAccountRegionOperations
    :ivar percentile_source_target: PercentileSourceTargetOperations operations
    :vartype percentile_source_target:
     azure.mgmt.cosmosdb.aio.operations.PercentileSourceTargetOperations
    :ivar percentile_target: PercentileTargetOperations operations
    :vartype percentile_target: azure.mgmt.cosmosdb.aio.operations.PercentileTargetOperations
    :ivar percentile: PercentileOperations operations
    :vartype percentile: azure.mgmt.cosmosdb.aio.operations.PercentileOperations
    :ivar collection_partition_region: CollectionPartitionRegionOperations operations
    :vartype collection_partition_region:
     azure.mgmt.cosmosdb.aio.operations.CollectionPartitionRegionOperations
    :ivar collection_partition: CollectionPartitionOperations operations
    :vartype collection_partition: azure.mgmt.cosmosdb.aio.operations.CollectionPartitionOperations
    :ivar partition_key_range_id: PartitionKeyRangeIdOperations operations
    :vartype partition_key_range_id:
     azure.mgmt.cosmosdb.aio.operations.PartitionKeyRangeIdOperations
    :ivar partition_key_range_id_region: PartitionKeyRangeIdRegionOperations operations
    :vartype partition_key_range_id_region:
     azure.mgmt.cosmosdb.aio.operations.PartitionKeyRangeIdRegionOperations
    :ivar sql_resources: SqlResourcesOperations operations
    :vartype sql_resources: azure.mgmt.cosmosdb.aio.operations.SqlResourcesOperations
    :ivar mongo_db_resources: MongoDBResourcesOperations operations
    :vartype mongo_db_resources: azure.mgmt.cosmosdb.aio.operations.MongoDBResourcesOperations
    :ivar table_resources: TableResourcesOperations operations
    :vartype table_resources: azure.mgmt.cosmosdb.aio.operations.TableResourcesOperations
    :ivar cassandra_resources: CassandraResourcesOperations operations
    :vartype cassandra_resources: azure.mgmt.cosmosdb.aio.operations.CassandraResourcesOperations
    :ivar gremlin_resources: GremlinResourcesOperations operations
    :vartype gremlin_resources: azure.mgmt.cosmosdb.aio.operations.GremlinResourcesOperations
    :ivar locations: LocationsOperations operations
    :vartype locations: azure.mgmt.cosmosdb.aio.operations.LocationsOperations
    :ivar cassandra_clusters: CassandraClustersOperations operations
    :vartype cassandra_clusters: azure.mgmt.cosmosdb.aio.operations.CassandraClustersOperations
    :ivar cassandra_data_centers: CassandraDataCentersOperations operations
    :vartype cassandra_data_centers:
     azure.mgmt.cosmosdb.aio.operations.CassandraDataCentersOperations
    :ivar notebook_workspaces: NotebookWorkspacesOperations operations
    :vartype notebook_workspaces: azure.mgmt.cosmosdb.aio.operations.NotebookWorkspacesOperations
    :ivar private_endpoint_connections: PrivateEndpointConnectionsOperations operations
    :vartype private_endpoint_connections:
     azure.mgmt.cosmosdb.aio.operations.PrivateEndpointConnectionsOperations
    :ivar private_link_resources: PrivateLinkResourcesOperations operations
    :vartype private_link_resources:
     azure.mgmt.cosmosdb.aio.operations.PrivateLinkResourcesOperations
    :ivar restorable_database_accounts: RestorableDatabaseAccountsOperations operations
    :vartype restorable_database_accounts:
     azure.mgmt.cosmosdb.aio.operations.RestorableDatabaseAccountsOperations
    :ivar restorable_sql_databases: RestorableSqlDatabasesOperations operations
    :vartype restorable_sql_databases:
     azure.mgmt.cosmosdb.aio.operations.RestorableSqlDatabasesOperations
    :ivar restorable_sql_containers: RestorableSqlContainersOperations operations
    :vartype restorable_sql_containers:
     azure.mgmt.cosmosdb.aio.operations.RestorableSqlContainersOperations
    :ivar restorable_sql_resources: RestorableSqlResourcesOperations operations
    :vartype restorable_sql_resources:
     azure.mgmt.cosmosdb.aio.operations.RestorableSqlResourcesOperations
    :ivar restorable_mongodb_databases: RestorableMongodbDatabasesOperations operations
    :vartype restorable_mongodb_databases:
     azure.mgmt.cosmosdb.aio.operations.RestorableMongodbDatabasesOperations
    :ivar restorable_mongodb_collections: RestorableMongodbCollectionsOperations operations
    :vartype restorable_mongodb_collections:
     azure.mgmt.cosmosdb.aio.operations.RestorableMongodbCollectionsOperations
    :ivar restorable_mongodb_resources: RestorableMongodbResourcesOperations operations
    :vartype restorable_mongodb_resources:
     azure.mgmt.cosmosdb.aio.operations.RestorableMongodbResourcesOperations
    :ivar restorable_gremlin_databases: RestorableGremlinDatabasesOperations operations
    :vartype restorable_gremlin_databases:
     azure.mgmt.cosmosdb.aio.operations.RestorableGremlinDatabasesOperations
    :ivar restorable_gremlin_graphs: RestorableGremlinGraphsOperations operations
    :vartype restorable_gremlin_graphs:
     azure.mgmt.cosmosdb.aio.operations.RestorableGremlinGraphsOperations
    :ivar restorable_gremlin_resources: RestorableGremlinResourcesOperations operations
    :vartype restorable_gremlin_resources:
     azure.mgmt.cosmosdb.aio.operations.RestorableGremlinResourcesOperations
    :ivar restorable_tables: RestorableTablesOperations operations
    :vartype restorable_tables: azure.mgmt.cosmosdb.aio.operations.RestorableTablesOperations
    :ivar restorable_table_resources: RestorableTableResourcesOperations operations
    :vartype restorable_table_resources:
     azure.mgmt.cosmosdb.aio.operations.RestorableTableResourcesOperations
    :ivar service: ServiceOperations operations
    :vartype service: azure.mgmt.cosmosdb.aio.operations.ServiceOperations
    :ivar fleet: FleetOperations operations
    :vartype fleet: azure.mgmt.cosmosdb.aio.operations.FleetOperations
    :ivar fleetspace: FleetspaceOperations operations
    :vartype fleetspace: azure.mgmt.cosmosdb.aio.operations.FleetspaceOperations
    :ivar fleetspace_account: FleetspaceAccountOperations operations
    :vartype fleetspace_account: azure.mgmt.cosmosdb.aio.operations.FleetspaceAccountOperations
    :param credential: Credential needed for the client to connect to Azure. Required.
    :type credential: ~azure.core.credentials_async.AsyncTokenCredential
    :param subscription_id: The ID of the target subscription. Required.
    :type subscription_id: str
    :param base_url: Service URL. Default value is None.
    :type base_url: str
    :keyword cloud_setting: The cloud setting for which to get the ARM endpoint. Default value is
     None.
    :paramtype cloud_setting: ~azure.core.AzureClouds
    :keyword api_version: Api Version. Default value is "2025-10-15". Note that overriding this
     default value may result in unsupported behavior.
    :paramtype api_version: str
    :keyword int polling_interval: Default waiting time between two polls for LRO operations if no
     Retry-After header is present.
    """

    def __init__(
        self,
        credential: "AsyncTokenCredential",
        subscription_id: str,
        base_url: Optional[str] = None,
        *,
        cloud_setting: Optional["AzureClouds"] = None,
        **kwargs: Any
    ) -> None:
        _cloud = cloud_setting or settings.current.azure_cloud  # type: ignore
        _endpoints = get_arm_endpoints(_cloud)
        if not base_url:
            base_url = _endpoints["resource_manager"]
        credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"])
        self._config = CosmosDBManagementClientConfiguration(
            credential=credential,
            subscription_id=subscription_id,
            cloud_setting=cloud_setting,
            credential_scopes=credential_scopes,
            **kwargs
        )

        _policies = kwargs.pop("policies", None)
        if _policies is None:
            _policies = [
                policies.RequestIdPolicy(**kwargs),
                self._config.headers_policy,
                self._config.user_agent_policy,
                self._config.proxy_policy,
                policies.ContentDecodePolicy(**kwargs),
                AsyncARMAutoResourceProviderRegistrationPolicy(),
                self._config.redirect_policy,
                self._config.retry_policy,
                self._config.authentication_policy,
                self._config.custom_hook_policy,
                self._config.logging_policy,
                policies.DistributedTracingPolicy(**kwargs),
                policies.SensitiveHeaderCleanupPolicy(**kwargs) if self._config.redirect_policy else None,
                self._config.http_logging_policy,
            ]
        self._client: AsyncARMPipelineClient = AsyncARMPipelineClient(
            base_url=cast(str, base_url), policies=_policies, **kwargs
        )

        client_models = {k: v for k, v in _models.__dict__.items() if isinstance(v, type)}
        self._serialize = Serializer(client_models)
        self._deserialize = Deserializer(client_models)
        self._serialize.client_side_validation = False
        self.database_accounts = DatabaseAccountsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.operations = Operations(self._client, self._config, self._serialize, self._deserialize)
        self.database = DatabaseOperations(self._client, self._config, self._serialize, self._deserialize)
        self.collection = CollectionOperations(self._client, self._config, self._serialize, self._deserialize)
        self.collection_region = CollectionRegionOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.database_account_region = DatabaseAccountRegionOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.percentile_source_target = PercentileSourceTargetOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.percentile_target = PercentileTargetOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.percentile = PercentileOperations(self._client, self._config, self._serialize, self._deserialize)
        self.collection_partition_region = CollectionPartitionRegionOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.collection_partition = CollectionPartitionOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.partition_key_range_id = PartitionKeyRangeIdOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.partition_key_range_id_region = PartitionKeyRangeIdRegionOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.sql_resources = SqlResourcesOperations(self._client, self._config, self._serialize, self._deserialize)
        self.mongo_db_resources = MongoDBResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.table_resources = TableResourcesOperations(self._client, self._config, self._serialize, self._deserialize)
        self.cassandra_resources = CassandraResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.gremlin_resources = GremlinResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.locations = LocationsOperations(self._client, self._config, self._serialize, self._deserialize)
        self.cassandra_clusters = CassandraClustersOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.cassandra_data_centers = CassandraDataCentersOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.notebook_workspaces = NotebookWorkspacesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.private_endpoint_connections = PrivateEndpointConnectionsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.private_link_resources = PrivateLinkResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_database_accounts = RestorableDatabaseAccountsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_sql_databases = RestorableSqlDatabasesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_sql_containers = RestorableSqlContainersOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_sql_resources = RestorableSqlResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_mongodb_databases = RestorableMongodbDatabasesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_mongodb_collections = RestorableMongodbCollectionsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_mongodb_resources = RestorableMongodbResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_gremlin_databases = RestorableGremlinDatabasesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_gremlin_graphs = RestorableGremlinGraphsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_gremlin_resources = RestorableGremlinResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_tables = RestorableTablesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.restorable_table_resources = RestorableTableResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.service = ServiceOperations(self._client, self._config, self._serialize, self._deserialize)
        self.fleet = FleetOperations(self._client, self._config, self._serialize, self._deserialize)
        self.fleetspace = FleetspaceOperations(self._client, self._config, self._serialize, self._deserialize)
        self.fleetspace_account = FleetspaceAccountOperations(
            self._client, self._config, self._serialize, self._deserialize
        )

    def _send_request(
        self, request: HttpRequest, *, stream: bool = False, **kwargs: Any
    ) -> Awaitable[AsyncHttpResponse]:
        """Runs the network request through the client's chained policies.

        >>> from azure.core.rest import HttpRequest
        >>> request = HttpRequest("GET", "https://www.example.org/")
        <HttpRequest [GET], url: 'https://www.example.org/'>
        >>> response = await client._send_request(request)
        <AsyncHttpResponse: 200 OK>

        For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request

        :param request: The network request you want to make. Required.
        :type request: ~azure.core.rest.HttpRequest
        :keyword bool stream: Whether the response payload will be streamed. Defaults to False.
        :return: The response of your network call. Does not do error handling on your response.
        :rtype: ~azure.core.rest.AsyncHttpResponse
        """

        request_copy = deepcopy(request)
        request_copy.url = self._client.format_url(request_copy.url)
        return self._client.send_request(request_copy, stream=stream, **kwargs)  # type: ignore

    async def close(self) -> None:
        await self._client.close()

    async def __aenter__(self) -> Self:
        await self._client.__aenter__()
        return self

    async def __aexit__(self, *exc_details: Any) -> None:
        await self._client.__aexit__(*exc_details)
