# Copyright 2016-2017 Versada <https://versada.eu/>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

import collections
import logging

import odoo.loglevels

_logger = logging.getLogger(__name__)
try:
    import raven
    from raven.conf import defaults
except ImportError:
    _logger.debug('Cannot import "raven". Please make sure it is installed.')


def split_multiple(string, delimiter=",", strip_chars=None):
    """Splits :param:`string` and strips :param:`strip_chars` from values."""
    if not string:
        return []
    return [v.strip(strip_chars) for v in string.split(delimiter)]


SentryOption = collections.namedtuple("SentryOption", ["key", "default", "converter"])

# Mapping of Odoo logging level -> Python stdlib logging library log level.
LOG_LEVEL_MAP = {
    getattr(odoo.loglevels, "LOG_%s" % x): getattr(logging, x)
    for x in ("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG", "NOTSET")
}
DEFAULT_LOG_LEVEL = "warn"

ODOO_USER_EXCEPTIONS = [
    "odoo.exceptions.AccessDenied",
    "odoo.exceptions.AccessError",
    "odoo.exceptions.DeferredException",
    "odoo.exceptions.MissingError",
    "odoo.exceptions.RedirectWarning",
    "odoo.exceptions.UserError",
    "odoo.exceptions.ValidationError",
    "odoo.exceptions.Warning",
    "odoo.exceptions.except_orm",
]
DEFAULT_IGNORED_EXCEPTIONS = ",".join(ODOO_USER_EXCEPTIONS)

PROCESSORS = (
    "raven.processors.SanitizePasswordsProcessor",
    "odoo.addons.sentry.logutils.SanitizeOdooCookiesProcessor",
)
DEFAULT_PROCESSORS = ",".join(PROCESSORS)

EXCLUDE_LOGGERS = ("werkzeug",)
DEFAULT_EXCLUDE_LOGGERS = ",".join(EXCLUDE_LOGGERS)

DEFAULT_TRANSPORT = "threaded"


def select_transport(name=DEFAULT_TRANSPORT):
    return {
        "requests_synchronous": raven.transport.RequestsHTTPTransport,
        "requests_threaded": raven.transport.ThreadedRequestsHTTPTransport,
        "synchronous": raven.transport.HTTPTransport,
        "threaded": raven.transport.ThreadedHTTPTransport,
    }.get(name, DEFAULT_TRANSPORT)


def get_sentry_options():
    return [
        SentryOption("dsn", "", str.strip),
        SentryOption("install_sys_hook", False, None),
        SentryOption("transport", DEFAULT_TRANSPORT, select_transport),
        SentryOption("include_paths", "", split_multiple),
        SentryOption("exclude_paths", "", split_multiple),
        SentryOption("machine", defaults.NAME, None),
        SentryOption("auto_log_stacks", defaults.AUTO_LOG_STACKS, None),
        SentryOption("capture_locals", defaults.CAPTURE_LOCALS, None),
        SentryOption("string_max_length", defaults.MAX_LENGTH_STRING, None),
        SentryOption("list_max_length", defaults.MAX_LENGTH_LIST, None),
        SentryOption("site", None, None),
        SentryOption("include_versions", True, None),
        SentryOption("ignore_exceptions", DEFAULT_IGNORED_EXCEPTIONS, split_multiple),
        SentryOption("processors", DEFAULT_PROCESSORS, split_multiple),
        SentryOption("environment", None, None),
        SentryOption("release", None, None),
    ]