#!/usr/bin/python3 -sP

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

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

if __name__ == "__main__":
    parser = ArgParser(prog='dnsconfd',
                       description='local DNS cache configuration daemon')
    parser.add_arguments()
    parser.add_commands()
    try:
        args = parser.parse_args()
    except ValueError:
        sys.exit(ExitCode.BAD_ARGUMENTS.value)

    # 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)

    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()
    sys.exit(ctx.get_exit_code())
