#!/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.jolokia import *  # pylint: disable=wildcard-import,unused-wildcard-import


def parse_jolokia_generic(info):
    parsed = {}
    for line in info:
        try:
            instance, mbean, value, type_ = jolokia_basic_split(line, 4)
            if type_ in ("rate", "number"):
                value = float(value)
        except ValueError:
            continue
        item = "%s %s" % (instance, mbean)
        parsed[item] = {"value": value, "type": type_}

    return parsed


# .
#   .--String--------------------------------------------------------------.
#   |                    ____  _        _                                  |
#   |                   / ___|| |_ _ __(_)_ __   __ _                      |
#   |                   \___ \| __| '__| | '_ \ / _` |                     |
#   |                    ___) | |_| |  | | | | | (_| |                     |
#   |                   |____/ \__|_|  |_|_| |_|\__, |                     |
#   |                                           |___/                      |
#   '----------------------------------------------------------------------'


@get_parsed_item_data
def check_jolokia_generic_string(_item, params, data):
    value = data["value"]

    search_strings = params.get("match_strings", [])
    for search_string, status in search_strings:
        if search_string in value:
            return status, "%s: %s matches" % (value, search_string)

    return params.get("default_status", 0), value


check_info["jolokia_generic.string"] = {
    "inventory_function": discover(lambda key, data: data.get("type") == "string"),
    "check_function": check_jolokia_generic_string,
    "service_description": "JVM %s",
    "group": "generic_string",
}

# .
#   .--Rate----------------------------------------------------------------.
#   |                         ____       _                                 |
#   |                        |  _ \ __ _| |_ ___                           |
#   |                        | |_) / _` | __/ _ \                          |
#   |                        |  _ < (_| | ||  __/                          |
#   |                        |_| \_\__,_|\__\___|                          |
#   |                                                                      |
#   '----------------------------------------------------------------------'


@get_parsed_item_data
def check_jolokia_generic_rate(item, params, data):
    rate = get_rate(item, time.time(), data["value"])
    levels = params.get("levels", (None, None)) + params.get("levels_lower", (None, None))
    return check_levels(rate, "generic_rate", levels)


check_info["jolokia_generic.rate"] = {
    "inventory_function": discover(lambda key, data: data.get("type") == "rate"),
    "check_function": check_jolokia_generic_rate,
    "service_description": "JVM %s",
    "has_perfdata": True,
    "group": "generic_rate",
}

# .
#   .--Number--------------------------------------------------------------.
#   |                _   _                 _                               |
#   |               | \ | |_   _ _ __ ___ | |__   ___ _ __                 |
#   |               |  \| | | | | '_ ` _ \| '_ \ / _ \ '__|                |
#   |               | |\  | |_| | | | | | | |_) |  __/ |                   |
#   |               |_| \_|\__,_|_| |_| |_|_.__/ \___|_|                   |
#   |                                                                      |
#   '----------------------------------------------------------------------'


@get_parsed_item_data
def check_jolokia_generic(_item, params, data):
    levels = params.get("levels", (None, None)) + params.get("levels_lower", (None, None))
    return check_levels(data["value"], "generic_number", levels)


check_info["jolokia_generic"] = {
    "inventory_function": discover(lambda key, data: data.get("type") == "number"),
    "check_function": check_jolokia_generic,
    "parse_function": parse_jolokia_generic,
    "service_description": "JVM %s",
    "has_perfdata": True,
    "group": "generic_number",
}
