/*
 *
 *  Connection Manager
 *
 *  Copyright (C) 2012  Intel Corporation. All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <getopt.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <glib.h>
#include <gdbus.h>

#include "services.h"
#include "technology.h"
#include "data_manager.h"
#include "monitor.h"
#include "interactive.h"

static DBusConnection *interactive_conn;

static char **parse_long(char *input, int *num_args)
{
	int i;
	char **token = NULL;

	for (i = 0; input != NULL; i++) {
		token = realloc(token, (i + 1) * sizeof(char *));
		if (token == NULL)
			return NULL;
		token[i] = strdup(input);
		input = strtok(NULL, " ");
	}
	*num_args = i;

	return token;
}

static gboolean rl_handler(char *input)
{
	char **long_args;
	int num_args, i, error=FALSE;
	num_args = 0;

	if (input == NULL) {
		rl_newline(1, '\n');
		exit(EXIT_FAILURE);
	}

	add_history(input);
	input = strtok(input, " ");

	if (input == NULL)
		goto bail;
	long_args = parse_long(input, &num_args);

	if (long_args == NULL) {
		free(input);
		exit(EXIT_FAILURE);
	} else {
		error = commands_no_options(interactive_conn,
						long_args, num_args);
		if (error == -1)
			error = commands_options(interactive_conn, long_args,
						num_args);
		else
			goto bail;
	}
	if ((strcmp(long_args[0], "quit") == 0)
					|| (strcmp(long_args[0], "exit") == 0)
					|| (strcmp(long_args[0], "q") == 0)) {
		for (i = 0; i < num_args; i++)
			free(long_args[i]);
		free(long_args);
		exit(EXIT_SUCCESS);
	}
	if (error == -1) {
		fprintf(stderr, "%s is not a valid command, check help.\n",
			long_args[0]);
	}

	for (i = 0; i < num_args; i++)
		free(long_args[i]);
	free(long_args);
	optind = 0;

	error = TRUE;
bail:
	rl_callback_handler_install("connmanctl> ", (void *)rl_handler);
	return error;
}

static gboolean readmonitor(GIOChannel *channel, GIOCondition condition,
							gpointer user_data){
	if (condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) {
		g_io_channel_unref(channel);
		return FALSE;
	}
	rl_callback_read_char();
	return TRUE;
}

void show_interactive(DBusConnection *connection, GMainLoop *mainloop)
{
	GIOChannel *gchan;
	int events;
	gchan = g_io_channel_unix_new(fileno(stdin));
	events = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
	interactive_conn = connection;

	while (TRUE) {
		g_io_add_watch(gchan, events, readmonitor, NULL);
		rl_callback_handler_install("connmanctl> ", (void *)rl_handler);
		g_main_loop_run(mainloop);

		rl_callback_handler_remove();
		g_io_channel_unref(gchan);
	}
}
