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

# Example output from agent:
# <<<ibm_svc_array:sep(58)>>>
# 27:SSD_mdisk27:online:1:POOL_0_V7000_RZ:372.1GB:online:raid1:1:256:generic_ssd
# 28:SSD_mdisk28:online:2:POOL_1_V7000_BRZ:372.1GB:online:raid1:1:256:generic_ssd
# 29:SSD_mdisk0:online:1:POOL_0_V7000_RZ:372.1GB:online:raid1:1:256:generic_ssd
# 30:SSD_mdisk1:online:2:POOL_1_V7000_BRZ:372.1GB:online:raid1:1:256:generic_ssd


def parse_ibm_svc_array(info):
    dflt_header = [
        "mdisk_id",
        "mdisk_name",
        "status",
        "mdisk_grp_id",
        "mdisk_grp_name",
        "capacity",
        "raid_status",
        "raid_level",
        "redundancy",
        "strip_size",
        "tier",
        "encrypt",
    ]
    parsed = {}
    for id_, rows in parse_ibm_svc_with_header(info, dflt_header).items():
        try:
            data = rows[0]
        except IndexError:
            continue
        parsed.setdefault(id_, data)
    return parsed


@get_parsed_item_data
def check_ibm_svc_array(item, _no_params, data):
    raid_status = data["raid_status"]
    raid_level = data["raid_level"]
    tier = data["tier"]

    # Check raid_status
    message = "Status: %s" % raid_status
    if raid_status == "online":
        status = 0
    elif raid_status in ("offline", "degraded"):
        status = 2
    else:
        status = 1

    # add information
    message += ", RAID Level: %s, Tier: %s" % (raid_level, tier)

    return status, message


check_info["ibm_svc_array"] = {
    "parse_function": parse_ibm_svc_array,
    "check_function": check_ibm_svc_array,
    "inventory_function": discover(),
    "service_description": "RAID Array %s",
}
