#!/usr/bin/env python3

"""
Kuhn & Rueß GmbH
Consulting and Development
https://kuhn-ruess.de
"""

from sys import argv
from json import dumps
from os import environ
from requests import get


class AgentServicecounter():
    """
    Agent Json
    """

    def get_user(self):
        """
        Get automation user and secret
        """
        with open(f"{environ.get('OMD_ROOT')}/var/check_mk/web/automation/automation.secret", "r") as f:
            data = f.read()
            f.close()

        self._username = "automation"
        self._secret = data.strip()


    def __init__(self):
        """
        Init
        """
        self.timeout = float(argv[1])
        self.path = argv[2]
        self.config = [ x.split("|") for x in argv[3:]]
        self.get_user()
        # The Site Url is configured in Case this checks runs on a remote Site
        self._site_url = f"{self.path}/check_mk/api/1.0"


    def get(self, url, params):
        """
        Simple Get
        """
        content = get(
            f"{self._site_url}{url}",
            params = params,
            headers = {"Authorization": f"Bearer {self._username} {self._secret}"},
            timeout = self.timeout,
        )

        if content.status_code == 200 or content.status_code == 204:
            return content.json()
        else:
            return {}


    def get_services(self):
        """
        Get services from Livestatus API
        """
        print("<<<service_metric_counter:sep(58)>>>")
        for service_name, ls_filter, metric, metric_label in self.config:

            sub_expr = []
            for sub in ls_filter.split(';'):
                sub = sub.strip()
                if '~' in sub:
                    op = '~'
                elif '=' in sub:
                    op = '='
                else:
                    op = '='
                left, right = sub.split(op)
                sub_expr.append({'op': op, 'left': left, 'right': right})



            expr = [{ "op": "and", "expr": sub_expr}]

            params = {
                "query": str(
                    dumps(
                        {
                            "op": "or",
                            "expr": expr,
                        }
                    )
                ),
                "columns": ['performance_data'],
            }

            url = "/domain-types/service/collections/all"
            data = self.get(url, params)['value']
            total = 0
            for svc in data:
                if perf_data := svc['extensions']['performance_data'].get(metric):
                    total += perf_data
            print(f"{service_name}:{total}:{metric}:{metric_label}")


if __name__ == "__main__":
    agent = AgentServicecounter()
    agent.get_services()
