#!/usr/bin/env python3

import argparse
import logging
import os
import sys
import threading
from logging import info

import LibreNMS

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="LibreNMS Service - manages polling and other periodic processes"
    )
    parser.add_argument(
        "-g",
        "--group",
        nargs="+",
        type=int,
        help="Set the poller group for this poller",
    )
    parser.add_argument("-v", "--verbose", action="count", help="Show verbose output.")
    parser.add_argument("-d", "--debug", action="store_true", help="Show debug output.")
    parser.add_argument(
        "-o",
        "--log-output",
        nargs="?",
        const="file",
        default="none",
        type=LibreNMS.LogOutput,
        choices=list(LibreNMS.LogOutput),
        metavar="DEST",
        help=(
            "Where to direct poller log messages.\n"
            "  --log-output         = log to file (same as --log-output file)\n"
            "  --log-output DEST    = log to none, passthrough, logger, file\n"
            "  (not specified)      = no dedicated poller output logging (=none)"
        ),
    )
    parser.add_argument(
        "-m",
        "--multiple",
        action="store_true",
        help="Allow multiple instances of the service.",
    )
    parser.add_argument(
        "-t",
        "--timestamps",
        action="store_true",
        help="Include timestamps in the logs (not normally needed for syslog/journald",
    )

    args = parser.parse_args()

    if args.timestamps:
        logging.basicConfig(
            format="%(asctime)s %(threadName)s(%(levelname)s):%(message)s"
        )
    else:
        logging.basicConfig(format="%(threadName)s(%(levelname)s):%(message)s")

    if args.verbose:
        logging.getLogger().setLevel(logging.INFO)
    elif args.debug:
        logging.getLogger().setLevel(logging.DEBUG)
    else:
        logging.getLogger().setLevel(logging.WARNING)

    info("Configuring LibreNMS service")
    try:
        service = LibreNMS.Service()
    except Exception as e:
        # catch any initialization errors and print the message instead of a stack trace
        print(e)
        sys.exit(2)

    service.config.single_instance = args.multiple
    service.config.log_output = args.log_output

    if args.group:
        if isinstance(args.group, list):
            service.config.group = args.group
        else:
            service.config.group = [args.group]

    info(
        "Entering main LibreNMS service loop on {}/{}...".format(
            os.getpid(), threading.current_thread().name
        )
    )
    service.start()
