# 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) Python Code Generator.
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------

from copy import deepcopy
import sys
from typing import Any, Optional, TYPE_CHECKING, cast

from azure.core.pipeline import policies
from azure.core.rest import HttpRequest, HttpResponse
from azure.core.settings import settings
from azure.mgmt.core import ARMPipelineClient
from azure.mgmt.core.policies import ARMAutoResourceProviderRegistrationPolicy
from azure.mgmt.core.tools import get_arm_endpoints

from ._configuration import MonitorManagementClientConfiguration
from ._utils.serialization import Deserializer, Serializer
from .operations import (
    ActionGroupsOperations,
    ActivityLogAlertsOperations,
    ActivityLogsOperations,
    AlertRuleIncidentsOperations,
    AutoscaleSettingsOperations,
    BaselinesOperations,
    DataCollectionEndpointsOperations,
    DataCollectionRuleAssociationsOperations,
    DataCollectionRulesOperations,
    EventCategoriesOperations,
    LogProfilesOperations,
    MetricAlertsOperations,
    MetricAlertsStatusOperations,
    MetricDefinitionsOperations,
    MetricNamespacesOperations,
    MetricsOperations,
    PredictiveMetricOperations,
    PrivateEndpointConnectionsOperations,
    PrivateLinkResourcesOperations,
    PrivateLinkScopeOperationStatusOperations,
    PrivateLinkScopedResourcesOperations,
    PrivateLinkScopesOperations,
    ScheduledQueryRuleOperations,
    ScheduledQueryRulesOperations,
    ServiceDiagnosticSettingsOperations,
    TenantActivityLogsOperations,
)

if sys.version_info >= (3, 11):
    from typing import Self
else:
    from typing_extensions import Self  # type: ignore

if TYPE_CHECKING:
    from azure.core import AzureClouds
    from azure.core.credentials import TokenCredential


class MonitorManagementClient:  # pylint: disable=client-accepts-api-version-keyword,too-many-instance-attributes
    """MonitorManagementClient.

    :ivar private_link_resources: PrivateLinkResourcesOperations operations
    :vartype private_link_resources: azure.mgmt.monitor.operations.PrivateLinkResourcesOperations
    :ivar private_endpoint_connections: PrivateEndpointConnectionsOperations operations
    :vartype private_endpoint_connections:
     azure.mgmt.monitor.operations.PrivateEndpointConnectionsOperations
    :ivar data_collection_endpoints: DataCollectionEndpointsOperations operations
    :vartype data_collection_endpoints:
     azure.mgmt.monitor.operations.DataCollectionEndpointsOperations
    :ivar scheduled_query_rule: ScheduledQueryRuleOperations operations
    :vartype scheduled_query_rule: azure.mgmt.monitor.operations.ScheduledQueryRuleOperations
    :ivar data_collection_rule_associations: DataCollectionRuleAssociationsOperations operations
    :vartype data_collection_rule_associations:
     azure.mgmt.monitor.operations.DataCollectionRuleAssociationsOperations
    :ivar data_collection_rules: DataCollectionRulesOperations operations
    :vartype data_collection_rules: azure.mgmt.monitor.operations.DataCollectionRulesOperations
    :ivar private_link_scopes: PrivateLinkScopesOperations operations
    :vartype private_link_scopes: azure.mgmt.monitor.operations.PrivateLinkScopesOperations
    :ivar private_link_scoped_resources: PrivateLinkScopedResourcesOperations operations
    :vartype private_link_scoped_resources:
     azure.mgmt.monitor.operations.PrivateLinkScopedResourcesOperations
    :ivar private_link_scope_operation_status: PrivateLinkScopeOperationStatusOperations operations
    :vartype private_link_scope_operation_status:
     azure.mgmt.monitor.operations.PrivateLinkScopeOperationStatusOperations
    :ivar autoscale_settings: AutoscaleSettingsOperations operations
    :vartype autoscale_settings: azure.mgmt.monitor.operations.AutoscaleSettingsOperations
    :ivar predictive_metric: PredictiveMetricOperations operations
    :vartype predictive_metric: azure.mgmt.monitor.operations.PredictiveMetricOperations
    :ivar activity_logs: ActivityLogsOperations operations
    :vartype activity_logs: azure.mgmt.monitor.operations.ActivityLogsOperations
    :ivar event_categories: EventCategoriesOperations operations
    :vartype event_categories: azure.mgmt.monitor.operations.EventCategoriesOperations
    :ivar tenant_activity_logs: TenantActivityLogsOperations operations
    :vartype tenant_activity_logs: azure.mgmt.monitor.operations.TenantActivityLogsOperations
    :ivar metric_definitions: MetricDefinitionsOperations operations
    :vartype metric_definitions: azure.mgmt.monitor.operations.MetricDefinitionsOperations
    :ivar metric_namespaces: MetricNamespacesOperations operations
    :vartype metric_namespaces: azure.mgmt.monitor.operations.MetricNamespacesOperations
    :ivar metrics: MetricsOperations operations
    :vartype metrics: azure.mgmt.monitor.operations.MetricsOperations
    :ivar service_diagnostic_settings: ServiceDiagnosticSettingsOperations operations
    :vartype service_diagnostic_settings:
     azure.mgmt.monitor.operations.ServiceDiagnosticSettingsOperations
    :ivar alert_rule_incidents: AlertRuleIncidentsOperations operations
    :vartype alert_rule_incidents: azure.mgmt.monitor.operations.AlertRuleIncidentsOperations
    :ivar log_profiles: LogProfilesOperations operations
    :vartype log_profiles: azure.mgmt.monitor.operations.LogProfilesOperations
    :ivar activity_log_alerts: ActivityLogAlertsOperations operations
    :vartype activity_log_alerts: azure.mgmt.monitor.operations.ActivityLogAlertsOperations
    :ivar metric_alerts: MetricAlertsOperations operations
    :vartype metric_alerts: azure.mgmt.monitor.operations.MetricAlertsOperations
    :ivar metric_alerts_status: MetricAlertsStatusOperations operations
    :vartype metric_alerts_status: azure.mgmt.monitor.operations.MetricAlertsStatusOperations
    :ivar scheduled_query_rules: ScheduledQueryRulesOperations operations
    :vartype scheduled_query_rules: azure.mgmt.monitor.operations.ScheduledQueryRulesOperations
    :ivar baselines: BaselinesOperations operations
    :vartype baselines: azure.mgmt.monitor.operations.BaselinesOperations
    :ivar action_groups: ActionGroupsOperations operations
    :vartype action_groups: azure.mgmt.monitor.operations.ActionGroupsOperations
    :param credential: Credential used to authenticate requests to the service. Required.
    :type credential: ~azure.core.credentials.TokenCredential
    :param subscription_id: The ID of the target subscription. The value must be an UUID. Required.
    :type subscription_id: str
    :param base_url: Service host. 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 int polling_interval: Default waiting time between two polls for LRO operations if no
     Retry-After header is present.
    """

    def __init__(
        self,
        credential: "TokenCredential",
        subscription_id: str,
        base_url: Optional[str] = None,
        *,
        cloud_setting: Optional["AzureClouds"] = None,
        **kwargs: Any
    ) -> None:
        _endpoint = "{endpoint}"
        _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 = MonitorManagementClientConfiguration(
            credential=credential,
            subscription_id=subscription_id,
            base_url=cast(str, base_url),
            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),
                ARMAutoResourceProviderRegistrationPolicy(),
                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: ARMPipelineClient = ARMPipelineClient(base_url=cast(str, _endpoint), policies=_policies, **kwargs)

        self._serialize = Serializer()
        self._deserialize = Deserializer()
        self._serialize.client_side_validation = False
        self.private_link_resources = PrivateLinkResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.private_endpoint_connections = PrivateEndpointConnectionsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.data_collection_endpoints = DataCollectionEndpointsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.scheduled_query_rule = ScheduledQueryRuleOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.data_collection_rule_associations = DataCollectionRuleAssociationsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.data_collection_rules = DataCollectionRulesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.private_link_scopes = PrivateLinkScopesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.private_link_scoped_resources = PrivateLinkScopedResourcesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.private_link_scope_operation_status = PrivateLinkScopeOperationStatusOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.autoscale_settings = AutoscaleSettingsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.predictive_metric = PredictiveMetricOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.activity_logs = ActivityLogsOperations(self._client, self._config, self._serialize, self._deserialize)
        self.event_categories = EventCategoriesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.tenant_activity_logs = TenantActivityLogsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.metric_definitions = MetricDefinitionsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.metric_namespaces = MetricNamespacesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.metrics = MetricsOperations(self._client, self._config, self._serialize, self._deserialize)
        self.service_diagnostic_settings = ServiceDiagnosticSettingsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.alert_rule_incidents = AlertRuleIncidentsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.log_profiles = LogProfilesOperations(self._client, self._config, self._serialize, self._deserialize)
        self.activity_log_alerts = ActivityLogAlertsOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.metric_alerts = MetricAlertsOperations(self._client, self._config, self._serialize, self._deserialize)
        self.metric_alerts_status = MetricAlertsStatusOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.scheduled_query_rules = ScheduledQueryRulesOperations(
            self._client, self._config, self._serialize, self._deserialize
        )
        self.baselines = BaselinesOperations(self._client, self._config, self._serialize, self._deserialize)
        self.action_groups = ActionGroupsOperations(self._client, self._config, self._serialize, self._deserialize)

    def send_request(self, request: HttpRequest, *, stream: bool = False, **kwargs: Any) -> HttpResponse:
        """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 = client.send_request(request)
        <HttpResponse: 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.HttpResponse
        """

        request_copy = deepcopy(request)
        path_format_arguments = {
            "endpoint": self._serialize.url("self._config.base_url", self._config.base_url, "str", skip_quote=True),
        }

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

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

    def __enter__(self) -> Self:
        self._client.__enter__()
        return self

    def __exit__(self, *exc_details: Any) -> None:
        self._client.__exit__(*exc_details)
