#!/usr/bin/env python3
# -*- coding: utf-8; py-indent-offset: 4 -*-
#
# Author:  Linuxfabrik GmbH, Zurich, Switzerland
# Contact: info (at) linuxfabrik (dot) ch
#          https://www.linuxfabrik.ch/
# License: The Unlicense, see LICENSE file.

# https://github.com/Linuxfabrik/monitoring-plugins/blob/main/CONTRIBUTING.md

"""See the check's README for more details."""

import argparse
import sys

import lib.args
import lib.base
import lib.human
import lib.lftest
import lib.nodebb
import lib.time
from lib.globals import STATE_OK, STATE_UNKNOWN

__author__ = 'Linuxfabrik GmbH, Zurich/Switzerland'
__version__ = '2026083001'

DESCRIPTION = """Retrieves recent events from the NodeBB event log via the admin API. Reports
administrative actions such as user bans, plugin activations, and configuration
changes.
The figures are reported for trending and never alert on their own."""

DEFAULT_INSECURE = False
DEFAULT_NO_PROXY = False
DEFAULT_TIMEOUT = 3
DEFAULT_URL = 'http://localhost:4567/forum'


def parse_args():
    """Parse command line arguments using argparse."""
    parser = argparse.ArgumentParser(
        description=DESCRIPTION,
        epilog=lib.args.epilog(__file__),
        formatter_class=lib.args.HelpFormatter,
    )

    parser.add_argument(
        '-V',
        '--version',
        action='version',
        version=f'%(prog)s: v{__version__} by {__author__}',
    )

    parser.add_argument(
        '--always-ok',
        help=lib.args.help('--always-ok'),
        dest='ALWAYS_OK',
        action='store_true',
        default=False,
    )

    parser.add_argument(
        '--insecure',
        help=lib.args.help('--insecure'),
        dest='INSECURE',
        action='store_true',
        default=DEFAULT_INSECURE,
    )

    parser.add_argument(
        '--no-proxy',
        help=lib.args.help('--no-proxy'),
        dest='NO_PROXY',
        action='store_true',
        default=DEFAULT_NO_PROXY,
    )

    parser.add_argument(
        '--proxy',
        help=lib.args.help('--proxy'),
        dest='PROXY',
        default=None,
    )

    parser.add_argument(
        '--test',
        help=lib.args.help('--test'),
        dest='TEST',
        type=lib.args.csv,
    )

    parser.add_argument(
        '--timeout',
        help=lib.args.help('--timeout') + ' Default: %(default)s (seconds)',
        dest='TIMEOUT',
        type=int,
        default=DEFAULT_TIMEOUT,
    )

    parser.add_argument(
        '-p',
        '--token',
        help='NodeBB API bearer token.',
        dest='TOKEN',
        required=True,
    )

    parser.add_argument(
        '--url',
        help='NodeBB API URL. Default: %(default)s',
        dest='URL',
        default=DEFAULT_URL,
    )

    args, _ = parser.parse_known_args()
    return args


def main():
    """The main function. This is where the magic happens."""

    # parse the command line
    try:
        args = parse_args()
    except SystemExit:
        sys.exit(STATE_UNKNOWN)

    # fetch data
    if args.TEST is None:
        result = lib.nodebb.get_data(args, '/api/admin/advanced/events')
    else:
        # do not call the command, put in test data
        import json

        stdout, _stderr, _retc = lib.lftest.test(args.TEST)
        result = json.loads(stdout)

    # init some vars
    msg = ''
    table_data = []

    # analyze data
    for item in result['events']:
        # append subdict "user" to the parent item
        tmp = {**item, **item['user']}
        tmp['user'] = None
        ts_epoch = tmp['timestamp'] / 1000
        tmp['timestamp'] = (
            f'{lib.time.epoch2iso(ts_epoch)}'
            f' ({lib.human.seconds2human(lib.time.now(as_type="epoch") - ts_epoch)} ago)'
        )
        table_data.append(tmp)

    # build the message
    if len(result['events']) == 0:
        msg = 'Everything is ok.'
    else:
        evt = result['events'][0]
        ago = lib.human.seconds2human(
            lib.time.now(as_type='epoch') - evt['timestamp'] / 1000,
        )
        msg = (
            f'Latest event: #{evt["eid"]}'
            f' uid={evt["uid"]}'
            f' {evt["user"]["username"]}'
            f' {evt["type"]}'
            f' {evt["ip"]}'
            f' ({ago} ago)\n\n'
        )
        if table_data:
            keys = [
                'eid',
                'uid',
                'displayname',
                'type',
                'timestamp',
                'ip',
            ]
            headers = [
                'eid',
                'uid',
                'displayname',
                'type',
                'timestamp',
                'ip',
            ]
            msg += lib.base.get_table(table_data, keys, header=headers)

    # over and out
    lib.base.oao(msg, STATE_OK, always_ok=args.ALWAYS_OK)


if __name__ == '__main__':
    try:
        main()
    except Exception:
        lib.base.cu()
