#!/usr/bin/python3 -sP

from dnsconfd.fsm import ContextEvent
from dnsconfd.fsm import DnsconfdContext
from dnsconfd.input_modules import ResolveDbusInterface
from dnsconfd import DnsconfdArgumentParser as ArgParser

import signal
import logging
import dbus.mainloop.glib
from gi.repository import GLib

if __name__ == "__main__":
    logging.basicConfig(level=logging.getLevelName("WARNING"))
    parser = ArgParser(prog='dnsconfd',
                       description='local DNS cache network_objects daemon')
    parser.add_arguments()
    parser.add_commands()
    args = parser.parse_args()
    # This ensures that proper handler is called if command is provided, else
    # noop and execution returns here
    args.func()

    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    logging.getLogger().setLevel(args.log_level)

    main_loop = GLib.MainLoop()
    ctx = DnsconfdContext(vars(args), main_loop)
    # this has to happen before we expose the API
    GLib.idle_add(lambda: ctx.transition_function(ContextEvent("KICKOFF")))
    input_module = ResolveDbusInterface(ctx, vars(args))
    # using lambdas here allows us to not use exit in DnsconfdContext class
    signal.signal(signal.SIGTERM,
                  lambda signum, frame:
                  GLib.idle_add(lambda:
                                ctx.transition_function(ContextEvent("STOP"))))

    signal.signal(signal.SIGINT,
                  lambda signum, frame:
                  GLib.idle_add(lambda:
                                ctx.transition_function(ContextEvent("STOP"))))
    main_loop.run()
    exit(ctx.get_exit_code())
