#!/usr/bin/python3

import argparse
import configparser
import json
from pathlib import Path
from typing import List, Dict, Any


def read_events() -> List[Dict[str, Any]]:
    conf_dir = Path('/usr/share/syslog-ng-mod-astra/event-settings')

    events_dict = {}
    groups_dict = {}
    try:
        # TODO: move the following to a separate method (duplicates in ../buildhelper.py; ./config/mod_astra_events.py)
        for event_group_dir in conf_dir.iterdir():
            if not event_group_dir.is_dir():
                continue
            for event_settings_file in event_group_dir.iterdir():
                if not event_settings_file.is_file():
                    continue

                # Exclude files named the same as the group directory (group settings)
                if event_settings_file.name == event_group_dir.name:
                    try:
                        with event_settings_file.open() as file:
                            group = json.load(file)
                    except Exception as err:
                        print(f'generate-notifyrc.read_events(): {err}')
                    else:
                        try:
                            groups_dict.setdefault("astra-event-watcher_" + event_group_dir.name, []).append({
                                'group_name_ru': group.get('group-params').get('name_ru'),
                                'group_name_en': group.get('group-params').get('name_en'),
                            })
                        except Exception as err:
                            print(f'generate-notifyrc.read_events(): {err}')
                else:
                    try:
                        with event_settings_file.open() as file:
                            event = json.load(file)
                    except Exception as err:
                        print(f'generate-notifyrc.read_events(): {err}')
                    else:
                        try:
                            events_dict.setdefault("astra-event-watcher_" + event_group_dir.name, []).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'),
                            })

                            event_ids = event.get('message-params').get('message_id').split('_')
                            result_id = ''
                            for event_id in event_ids:
                                result_id += event_id if event_ids.index(event_id) == 0 else event_id.capitalize()

                        except Exception as err:
                            print(f'generate-notifyrc.read_events(): {err}')
    except Exception as err:
        print(f'generate-notifyrc.read_events(): {err}')

    return events_dict, groups_dict


def print_events(events_group_name, events, groups):
    parser = argparse.ArgumentParser(
        prog='generate-notifyrc',
        description='Generate .notifyrc file for the event registration subsystem')
    parser.add_argument('-o', '--output', default=f'/usr/share/knotifications5/{events_group_name}.notifyrc')
    args = parser.parse_args()

    config = configparser.ConfigParser()
    config.optionxform = str

    if events_group_name == 'astra-event-watcher_custom-events':
        config['Global'] = {
            'IconName': 'fly-admin-events',
            'Name': 'Event registration: Custom events',
            'Name[ru]': 'Регистрация событий: Пользовательские события',
            'Comment': 'Event registration: Custom events',
            'Comment[ru]': 'Регистрация событий: Пользовательские события',
        }
    else:
        for group in groups[events_group_name]:
            group_name_en = group.get('group_name_en')
            group_name_ru = group.get('group_name_ru')
            config['Global'] = {
                'IconName': 'fly-admin-events',
                'Name': 'Event registration: ' + group_name_en,
                'Name[ru]': 'Регистрация событий: ' + group_name_ru,
                'Comment': 'Event registration: ' + group_name_en,
                'Comment[ru]': 'Регистрация событий: ' + group_name_ru,
            }
    if events_group_name == 'astra-event-watcher_self-diagnostics':
        config['Event/selfDiagnostics'] = {
            'Name': 'Self-diagnostics of the event registration subsystem',
            'Name[ru]': 'Самодиагностика подсистемы регистрации событий',
            'Action': 'Popup',
        }

    # TODO: move the following to a separate method (duplicates in ../buildhelper.py)
    for event in events:
        event_ids = event.get('event_id').split('_')
        event_name_en = event.get('event_name_en')
        event_name_ru = event.get('event_name_ru')
        result_id = ''
        for event_id in event_ids:
            result_id += event_id if event_ids.index(event_id) == 0 else event_id.capitalize()
        config[f'Event/{result_id}'] = {
            'Name': event_name_en,
            'Name[ru]': event_name_ru,
            'Action': 'Popup',
        }

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


def main():
    if not Path('/usr/share/knotifications5').exists():
        exit(0)

    events_dict, groups_dict = read_events()
    if not events_dict:
        exit(-1)

    for key in events_dict:
        print_events(key, events_dict[key], groups_dict)


if __name__ == '__main__':
    main()
