#!/usr/bin/env python3
"""
Kuhn & Rueß GmbH
Consulting and Development
https://kuhn-ruess.de
"""

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


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.config = []
        for arg_set in argv[2:]:
            config_set = {}
            arg_set_splited = arg_set.split('|')
            for idx, what in enumerate(['name', 'service_pattern', 'host_label_pattern',
                    'host_name_pattern', 'host_label_pattern_negated', 'site_name_pattern']):
                config_set[what] = arg_set_splited[idx]
            self.config.append(config_set)
        self.get_user()
        omd_root = environ['OMD_ROOT']
        omd_site = environ['OMD_SITE']
        self._site_url = f"http://localhost:80/{omd_site}/check_mk/api/1.0"


    def get(self, url, params):
        """
        Simple Get
        """
        # We only talk to localhost, so fine to not verify
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        content = get(
            f"{self._site_url}{url}",
            params = params,
            headers = {"Authorization": f"Bearer {self._username} {self._secret}"},
            timeout = self.timeout,
            verify=False,
        )

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


    def get_services(self):
        """
        Get services from Livestatus API
                        
        """
        print("<<<local>>>")
        for service_config in self.config:
            service_filter = []
            service_output = []
            for option_name, option in service_config.items():
                if option == 'None':
                    continue
                if option_name == 'name':
                    # Service Name
                    service_filter.append({"op": "=", "left": "description", "right": option})
                    service_output.append(f'Desc: {option}')
                elif option_name == 'service_pattern':
                    # Service Output
                    service_filter.append({"op": "~", "left": "plugin_output", "right": option})
                    service_output.append(f'Output: {option}')
                elif option_name == 'host_label_pattern':
                    # Host Label
                    labels = []
                    for label in [x.strip() for x in option.split(',')]:
                        name, value = label.split(':')
                        service_filter.append({"op": "=", "left": "host_labels", "right": f"'{name}' '{value}'" })
                        labels.append(label)
                    service_output.append(f'Labels: {' '.join(labels)}')
                elif option_name == 'host_label_pattern_negated':
                    labels = []
                    for label in [x.strip() for x in option.split(',')]:
                        name, value = label.split(':')
                        service_filter.append({"op": "!=", "left": "host_labels", "right": f"'{name}' '{value}'" })
                        labels.append(label)
                    service_output.append(f'Labels negaded: {' '.join(labels)}')
                elif option_name == 'host_name_pattern':
                    # Hostname
                    service_filter.append({"op": "~", "left": "host_name", "right": option})
                    service_output.append(f'Hostname: {option}')
                elif option_name == 'site_name_pattern':
                    # Sitename
                    service_filter.append({"op": "=", "left": "plugin_output", "right": f"'site' : '{option}'"})
                    service_output.append(f'Site: {option}')

            expr = []
            expr.append(
                {
                    "op": "and", "expr": service_filter
                    
                }
            )

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

            url = "/domain-types/service/collections/all"
            resp = self.get(url, params)
            count = len(resp['value'])
            print(f"0 \"Count {', '.join(service_output)}\" count={count} Found {count} times")


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