#!/usr/bin/python3

import os
import configparser
import argparse
import json

def read_events() -> list:
    conf_file = "/etc/astra-syslog.conf"
    conf_dir = "/usr/share/syslog-ng-mod-astra/event-settings"

    events = []
    data = {}
    with open(conf_file, "r") as file:
        try:
            data = json.load(file)
        except Exception as e:
            print(e)
    try:
        dirs = os.listdir(conf_dir)
        for dir in dirs:
            current_dir = "{0}/{1}".format(conf_dir, dir)
            if not os.path.isdir(current_dir):
                continue
            event_files = os.listdir(current_dir)
            for file in event_files:
                # exclude group params
                if file == dir:
                    continue
                if not data.get(file):
                    data[file] = { "enabled": "1" }
                with open(current_dir + "/" + file, "r") as file:
                    try:
                        event = json.load(file)
                    except Exception as e:
                        print(e)
                    else:
                        try:
                            events.append({
                                "event_id": event.get("message-params").get("message_id"),
                                "event_name_ru": event.get("message-params").get("name_ru"),
                                "event_name_en": event.get("message-params").get("name_en"),
                            })
                        except Exception as e:
                            print(e)

    except Exception as e:
        print(e)

    return events

def main() -> None:
    parser = argparse.ArgumentParser(
                 prog = 'generate-notifyrc',
                 description = 'Generate .notifyrc file for the event registration subsystem')
    parser.add_argument('-o', '--output', default="/usr/share/knotifications5/astra-event-watcher.notifyrc")
    args = parser.parse_args()

    if not os.path.exists("/usr/share/knotifications5"):
        exit(0)

    events = read_events()
    if not events:
        exit(-1)

    config = configparser.ConfigParser()
    config.optionxform = str
    config["Global"] = {
        "IconName": "astra",
        "Name": "Notifications about system events",
        "Name[ru]": "Уведомления о системных событиях",
        "Comment": "Notifications about system events",
        "Comment[ru]": "Уведомления о системных событиях",
    }
    config["Event/selfDiagnostics"] = {
        "Name": "Self-diagnostics of the event registration subsystem",
        "Name[ru]": "Самодиагностика подсистемы регистрации событий",
        "Action": "Popup",
    }

    for event in events:
        event_id = event.get("event_id").split("_")
        event_name_en = event.get("event_name_en")
        event_name_ru = event.get("event_name_ru")
        result_id = ""
        for id in event_id:
            result_id += id if event_id.index(id) == 0 else id.capitalize()
        config["Event/{}".format(result_id)] = {
            "Name": event_name_en,
            "Name[ru]": event_name_ru,
            "Action": "Popup",
        }

    try:
        with open(args.output, "w") as file:
            config.write(file, False)
    except Exception as e:
        print(e)
        exit(-1)

if __name__ == "__main__":
    main()
