#include "config.h"

#include "gdbusdaemon.h"
#include <glib/gi18n.h>

int
main (int argc, char *argv[])
{
  GDBusDaemon *daemon;
  GMainLoop *loop;
  const char *address = NULL;
  const char *config_file = NULL;
  GError *error = NULL;
  gboolean print_address = FALSE;
  gboolean print_env = FALSE;
  GOptionContext *context;
  GOptionEntry entries[] = {
    { "address", 0, 0, G_OPTION_ARG_STRING, &address, N_("Address to listen on"), NULL },
    { "config-file", 0, 0, G_OPTION_ARG_STRING, &config_file, N_("Ignored, for compat with GTestDbus"), NULL },
    { "print-address", 0, 0, G_OPTION_ARG_NONE, &print_address, N_("Print address"), NULL },
    { "print-env", 0, 0, G_OPTION_ARG_NONE, &print_env, N_("Print address in shell mode"), NULL },
    G_OPTION_ENTRY_NULL
  };

  context = g_option_context_new ("");
  g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
  g_option_context_set_summary (context,
    N_("Run a dbus service"));
  g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);

  error = NULL;
  if (!g_option_context_parse (context, &argc, &argv, &error))
    {
      g_printerr ("%s\n", error->message);
      return 1;
    }

  g_option_context_free (context);

  if (argc != 1)
    {
      g_printerr (_("Wrong args\n"));
      return 1;
    }


  loop = g_main_loop_new (NULL, FALSE);

  if (argc >= 2)
    address = argv[1];

  daemon = _g_dbus_daemon_new (address, NULL, &error);
  if (daemon == NULL)
    {
      g_printerr ("Can't init bus: %s\n", error->message);
      return 1;
    }

  if (print_env)
    g_print ("export DBUS_SESSION_BUS_ADDRESS=\"%s\"\n", _g_dbus_daemon_get_address (daemon));

  if (print_address)
    g_print ("%s\n", _g_dbus_daemon_get_address (daemon));

  g_main_loop_run (loop);

  g_main_loop_unref (loop);

  return 0;
}
