#!/usr/bin/env python3
# Copyright (C) 2019 Checkmk 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.


import time

from cmk.base.check_api import check_levels, LegacyCheckDefinition
from cmk.base.config import check_info

from cmk.agent_based.v2 import get_value_store, render

BACKUP_STATE = {"Success": 0, "Warning": 1, "Failed": 2}

_DAY = 3600 * 24


def parse_veeam_tapejobs(string_table):
    parsed = {}
    columns = [s.lower() for s in string_table[0]]

    for line in string_table[1:]:
        if len(line) < len(columns):
            continue

        name = " ".join(line[: -(len(columns) - 1)])
        job_id, last_result, last_state = line[-(len(columns) - 1) :]
        parsed[name] = {
            "job_id": job_id,
            "last_result": last_result,
            "last_state": last_state,
        }

    return parsed


def inventory_veeam_tapejobs(parsed):
    for job in parsed:
        yield job, {}


def check_veeam_tapejobs(item, params, parsed):
    if not (data := parsed.get(item)):
        return

    value_store = get_value_store()
    job_id = data["job_id"]
    last_result = data["last_result"]
    last_state = data["last_state"]

    if last_result != "None" or last_state not in ("Working", "Idle"):
        yield BACKUP_STATE.get(last_result, 2), "Last backup result: %s" % last_result
        yield 0, "Last state: %s" % last_state
        value_store[f"{job_id}.running_since"] = None
        return

    running_since = value_store.get(f"{job_id}.running_since")
    now = time.time()
    if not running_since:
        running_since = now
        value_store[f"{job_id}.running_since"] = now
    running_time = now - running_since

    yield 0, "Backup in progress since {} (currently {})".format(
        render.datetime(running_since),
        last_state.lower(),
    )
    yield check_levels(
        running_time,
        None,
        params["levels_upper"],
        human_readable_func=render.timespan,
        infoname="Running time",
    )


check_info["veeam_tapejobs"] = LegacyCheckDefinition(
    parse_function=parse_veeam_tapejobs,
    service_name="VEEAM Tape Job %s",
    discovery_function=inventory_veeam_tapejobs,
    check_function=check_veeam_tapejobs,
    check_ruleset_name="veeam_tapejobs",
    check_default_parameters={
        "levels_upper": (1 * _DAY, 2 * _DAY),
    },
)
