# Unless explicitly stated otherwise all files in this repository are licensed under the BSD-3-Clause License.
# This product includes software developed at Datadog (https://www.datadoghq.com/).
# Copyright 2015-Present Datadog, Inc
"""
API & HTTP Clients exceptions.
"""


class DatadogException(Exception):
    """
    Base class for Datadog API exceptions.  Use this for patterns like the following:

        try:
            # do something with the Datadog API
        except datadog.api.exceptions.DatadogException:
            # handle any Datadog-specific exceptions
    """


class ProxyError(DatadogException):
    """
    HTTP connection to the configured proxy server failed.
    """
    def __init__(self, method, url, exception):
        message = u"Could not request {method} {url}: Unable to connect to proxy. "\
                  u"Please check the proxy configuration and try again.".format(
                      method=method, url=url
                  )
        super(ProxyError, self).__init__(message)


class ClientError(DatadogException):
    """
    HTTP connection to Datadog endpoint is not possible.
    """
    def __init__(self, method, url, exception):
        message = u"Could not request {method} {url}: {exception}. "\
                  u"Please check the network connection or try again later. "\
                  u"If the problem persists, please contact support@datadoghq.com".format(
                      method=method, url=url, exception=exception
                  )
        super(ClientError, self).__init__(message)


class HttpTimeout(DatadogException):
    """
    HTTP connection timeout.
    """
    def __init__(self, method, url, timeout):
        message = u"{method} {url} timed out after {timeout}. "\
                  u"Please try again later. "\
                  u"If the problem persists, please contact support@datadoghq.com".format(
                      method=method, url=url, timeout=timeout
                  )
        super(HttpTimeout, self).__init__(message)


class HttpBackoff(DatadogException):
    """
    Backing off after too many timeouts.
    """
    def __init__(self, backoff_period):
        message = u"Too many timeouts. Won't try again for {backoff_period} seconds. ".format(
                  backoff_period=backoff_period)
        super(HttpBackoff, self).__init__(message)


class HTTPError(DatadogException):
    """
    Datadog returned a HTTP error.
    """
    def __init__(self, status_code=None, reason=None):
        reason = u" - {reason}".format(reason=reason) if reason else u""
        message = u"Datadog returned a bad HTTP response code: {status_code}{reason}. "\
                  u"Please try again later. "\
                  u"If the problem persists, please contact support@datadoghq.com".format(
                      status_code=status_code,
                      reason=reason,
                  )

        super(HTTPError, self).__init__(message)


class ApiError(DatadogException):
    """
    Datadog returned an API error (known HTTPError).

    Matches the following status codes: 400, 401, 403, 404, 409, 429.
    """


class ApiNotInitialized(DatadogException):
    "No API key is set"
