#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <openbmc_intf.h>
#include <openbmc.h>

/* ------------------------------------------------------------------------- */
static const gchar* dbus_object_path = "/org/openbmc/control";
static const gchar* instance_name = "bmc0";
static const gchar* dbus_name = "org.openbmc.control.Bmc";

static GDBusObjectManagerServer *manager = NULL;

static gboolean
on_init(Control *control,
		GDBusMethodInvocation *invocation,
		gpointer user_data)
{
	control_complete_init(control,invocation);
	return TRUE;
}

static gboolean
on_warm_reset(ControlBmc *bmc,
		GDBusMethodInvocation *invocation,
		gpointer user_data)
{
	GError *err = NULL;
	/* Wait a while before reboot, so the caller can be responded.
	 * Note that g_spawn_command_line_async() cannot parse ';' as
	 * a command separator. Need to use 'sh -c' to let shell parse it.
	 */
	gchar *reboot_command = "/bin/sh -c 'sleep 3;reboot'";

	g_spawn_command_line_async(reboot_command, &err);
	if(err != NULL) {
		fprintf(stderr, "warmReset() error: %s\n", err->message);
		g_error_free(err);
	}

	control_bmc_complete_warm_reset(bmc, invocation);
	return TRUE;
}

static void
on_bus_acquired(GDBusConnection *connection,
		const gchar *name,
		gpointer user_data)
{
	ObjectSkeleton *object;
	cmdline *cmd = user_data;
	manager = g_dbus_object_manager_server_new(dbus_object_path);

	gchar *s;
	s = g_strdup_printf("%s/%s",dbus_object_path,instance_name);
	object = object_skeleton_new(s);
	g_free(s);

	ControlBmc* control_bmc = control_bmc_skeleton_new();
	object_skeleton_set_control_bmc(object, control_bmc);
	g_object_unref(control_bmc);

	Control* control = control_skeleton_new();
	object_skeleton_set_control(object, control);
	g_object_unref(control);

	//define method callbacks here
	g_signal_connect(control,
			"handle-init",
			G_CALLBACK(on_init),
			NULL); /* user_data */


	g_signal_connect(control_bmc,
			"handle-warm-reset",
			G_CALLBACK(on_warm_reset),
			NULL); /* user_data */

	/* Export the object (@manager takes its own reference to @object) */
	g_dbus_object_manager_server_export(manager, G_DBUS_OBJECT_SKELETON(object));
	g_object_unref(object);

	/* Export all objects */
	g_dbus_object_manager_server_set_connection(manager, connection);

	cmd->user_data = object;
}

static void
on_name_acquired(GDBusConnection *connection,
		const gchar *name,
		gpointer user_data)
{
}

static void
on_name_lost(GDBusConnection *connection,
		const gchar *name,
		gpointer user_data)
{
}

/*----------------------------------------------------------------*/
/* Main Event Loop                                                */

gint
main(gint argc, gchar *argv[])
{
	GMainLoop *loop;
	cmdline cmd;
	cmd.argc = argc;
	cmd.argv = argv;

	guint id;
	loop = g_main_loop_new(NULL, FALSE);
	cmd.loop = loop;

	id = g_bus_own_name(DBUS_TYPE,
			dbus_name,
			G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
			G_BUS_NAME_OWNER_FLAGS_REPLACE,
			on_bus_acquired,
			on_name_acquired,
			on_name_lost,
			&cmd,
			NULL);

	g_main_loop_run(loop);

	g_bus_unown_name(id);
	g_main_loop_unref(loop);
	return 0;
}
