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


def parse_blade_bays(info):
    map_states = {
        "0": (0, "standby"),
        "1": (0, "on"),
        "2": (1, "not present"),
        "3": (1, "switched off"),
        "255": (2, "not applicable"),
    }

    parsed = {}
    for pd_oidend, name, state, ty, identifier, power_str, power_max_str in info:
        pd, oid = pd_oidend.split(".", 1)
        if pd == "2":
            power_domain = 1
        else:
            power_domain = 2

        itemname = "PD%d %s" % (power_domain, name)
        if itemname in parsed:
            itemname = "%s %s" % (itemname, oid)

        try:
            power = int(power_str.rstrip("W"))
            power_max = int(power_max_str.rstrip("W"))
        except ValueError:
            power = 0

        parsed.setdefault(
            itemname,
            {
                "type": ty.split("(")[0],
                "id": identifier,
                "power_max": power_max,
                "device_state": map_states.get(state, (3, "unhandled[%s]" % state)),
                "power": power,
            },
        )

    return parsed


def inventory_blade_bays(parsed):
    for entry, attrs in parsed.items():
        if attrs["device_state"][1] in ["standby", "on"]:
            yield entry, {}


def check_blade_bays(item, params, parsed):
    if item not in parsed:
        yield 3, "No data for '%s' in SNMP info" % item
        return

    data = parsed[item]
    state, state_readable = data["device_state"]
    yield state, "Status: %s" % state_readable

    for res in check_elphase(item, params, parsed):
        yield res

    data = parsed[item]
    yield 0, "Max. power: %s W, Type: %s, ID: %s" % (data["power_max"], data["type"], data["id"])


check_info["blade_bays"] = {
    "parse_function": parse_blade_bays,
    "inventory_function": inventory_blade_bays,
    "check_function": check_blade_bays,
    "service_description": "BAY %s",
    "has_perfdata": True,
    "snmp_info": (
        ".1.3.6.1.4.1.2.3.51.2.2.10",
        [
            "2",  # powerDomain1
            "3",  # powerDomain2
        ],
        [OID_END, "1.1.5", "1.1.6", "1.1.2", "1.1.1", "1.1.7", "1.1.8"],
    ),  # BLADE-MIB
    "snmp_scan_function": scan_blade_modules,
}
