#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.

# NOTE: Careful when replacing the *-import below with a more specific import. This can cause
# problems because it might remove variables from the check-context which are necessary for
# resolving legacy discovery results such as [("SUMMARY", "diskstat_default_levels")]. Furthermore,
# it might also remove variables needed for accessing discovery rulesets.
from cmk.base.check_legacy_includes.couchbase import *  # pylint: disable=wildcard-import,unused-wildcard-import

# NOTE: Careful when replacing the *-import below with a more specific import. This can cause
# problems because it might remove variables from the check-context which are necessary for
# resolving legacy discovery results such as [("SUMMARY", "diskstat_default_levels")]. Furthermore,
# it might also remove variables needed for accessing discovery rulesets.
from cmk.base.check_legacy_includes.mem import *  # pylint: disable=wildcard-import,unused-wildcard-import


@get_parsed_item_data
def check_couchbase_bucket_mem(_item, params, data):
    warn, crit = params.get("levels", (None, None))
    mode = "abs_used" if isinstance(warn, int) else "perc_used"
    try:
        yield check_memory_element(
            "Usage",
            data["mem_total"] - data["mem_free"],
            data["mem_total"],
            (mode, (warn, crit)),
            metric_name="memused_couchbase_bucket",
        )
    except (KeyError, TypeError):
        pass

    low_watermark = data.get("ep_mem_low_wat")
    if low_watermark is not None:
        yield check_levels(
            low_watermark,
            "mem_low_wat",
            None,
            infoname="Low watermark",
            human_readable_func=get_bytes_human_readable,
        )

    high_watermark = data.get("ep_mem_high_wat")
    if high_watermark is not None:
        yield check_levels(
            high_watermark,
            "mem_high_wat",
            None,
            infoname="High watermark",
            human_readable_func=get_bytes_human_readable,
        )


check_info["couchbase_buckets_mem"] = {
    "parse_function": parse_couchbase_lines,
    "inventory_function": discover(lambda _k, v: "mem_total" in v and "mem_free" in v),
    "check_function": check_couchbase_bucket_mem,
    "service_description": "Couchbase Bucket %s Memory",
    "group": "memory_multiitem",
    "has_perfdata": True,
}
