#include "amhelper.h"
#include <mixlog.h>

static DBusGConnection *connection;

static DBusGProxy *proxy_lpe = NULL;

static gboolean am_enable=FALSE;

/* Connect to am dbus server
 * return -1 means failed
 * return 0 means succeeded
 * */
gint32 dbus_init() {
    GError *error;
    const char *name = "org.moblin.audiomanager";

    const char *path_lpe = "/org/moblin/audiomanager/lpe";
    const char *interface_lpe = "org.moblin.audiomanager.lpe";

    const gchar* env  = g_getenv("MIX_AM");
    if (env && env[0] == '1') {
	am_enable = TRUE;
    }
    else
	am_enable = FALSE;

    if (am_enable && (proxy_lpe == NULL)) {
	    error = NULL;
	    connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);

	    if (connection == NULL) {
		mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_WARNING, "Failed to open connection to bus: %s\n",
		            error->message);
		g_error_free(error);
		return -1;
	    }
	    mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_VERBOSE, "Successfully get a dbus connection\n");

	    proxy_lpe = dbus_g_proxy_new_for_name(connection, name,
		                            path_lpe, interface_lpe);
	    if (proxy_lpe == NULL) {
		mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_WARNING, "Failed to connect to AM dbus server\n");
		return -1;
	    } 
	    else {
	    	mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_VERBOSE, "Successfully connected to AM dbus\npath: %s\ninterface: %s\n",
			path_lpe, interface_lpe);
	    }
    }
    return 0;
}

gint32 lpe_stream_register(guint32 lpe_stream_id, char* media_role, char* lpe_stream_name, guint32 stream_type)
{
  GError *error;
  gint32 s_output = 0;
  error = NULL;

  if (am_enable) {
	  mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "lpe_stream_id: %d\n", lpe_stream_id);

	  if (lpe_stream_id == 0) {
		return 0;
	  }
	  if(!dbus_g_proxy_call (proxy_lpe, "LPEStreamRegister", &error, G_TYPE_UINT, 
		lpe_stream_id, G_TYPE_STRING, media_role, G_TYPE_STRING, lpe_stream_name, G_TYPE_UINT, stream_type,
		G_TYPE_INVALID, G_TYPE_INT, &s_output, G_TYPE_INVALID)) {
		mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_WARNING, "LPEStreamRegister failed: %s\n", error->message);
                g_error_free(error);
		return s_output;
	  }

	  mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_INFO, "LPEStreamRegister returned am stream id %d\n", s_output);
  }

  return s_output;
}

gint32 lpe_stream_unregister(guint32 am_stream_id)
{
  GError *error;
  gint32 s_output = 0;

  if (am_enable) {
	  error = NULL;
	  if(!dbus_g_proxy_call (proxy_lpe, "LPEStreamUnregister", &error, G_TYPE_UINT, am_stream_id, 
		G_TYPE_INVALID, G_TYPE_INT, &s_output, G_TYPE_INVALID)){
		mix_log(MIX_AUDIO_COMP, MIX_LOG_LEVEL_WARNING, "LPEStreamUnregister failed: %s\n", error->message);
		g_error_free(error);
		return s_output;
	  }
  }
  return s_output;
}

gint32 lpe_stream_notify_pause(guint32 am_stream_id)
{
  GError *error;
  gint32 s_output=0;

  if (am_enable) {
    dbus_g_proxy_call (proxy_lpe, "LPEStreamNotifyPause", &error, G_TYPE_UINT, am_stream_id, G_TYPE_INVALID, G_TYPE_INT, &s_output, G_TYPE_INVALID);
  }

  return s_output;
}

gint32 lpe_stream_notify_resume(guint32 am_stream_id)
{
  GError *error;
  gint32 s_output=0;

  if (am_enable) {
    dbus_g_proxy_call (proxy_lpe, "LPEStreamNotifyResume", &error, G_TYPE_UINT, am_stream_id, G_TYPE_INVALID, G_TYPE_INT, &s_output, G_TYPE_INVALID);
  }

  return s_output;
}

