/*
 * Gnophone: A client for the Asterisk PBX
 *
 * Copyright (C) 2000-2005, Digium, Inc.
 *
 * Written by Mark Spencer
 *
 * Linux/UNIX version distributed under the terms of
 * the GNU General Public License
 *
 * telco-gui.c: Configure Telco settings
 *
 */

#include "gnophone.h"

static GtkWidget *telcobox;
static GtkWidget *notebook;
static GtkWidget *server;
static GtkWidget *context;
static GtkWidget *port;
static GtkWidget *prefix;
static GtkWidget *username;
static GtkWidget *password;
static GtkWidget *peer;
static GtkWidget *secret;
static GtkWidget *nct_frame;

static int tmpmode;
#if 0
static void telco_cancel(void)
{
	gtk_widget_destroy(telcobox);
}

static void telco_okay(void)
{
	int row=0;
	char *s;
	s = NULL;
	telco_set_server(gtk_entry_get_text(GTK_ENTRY(server)));
	telco_set_context(gtk_entry_get_text(GTK_ENTRY(context)));
	telco_set_username(gtk_entry_get_text(GTK_ENTRY(username)));
	telco_set_password(gtk_entry_get_text(GTK_ENTRY(password)));
	telco_set_peer(gtk_entry_get_text(GTK_ENTRY(peer)));
	telco_set_secret(gtk_entry_get_text(GTK_ENTRY(secret)));
	if (atoi(gtk_entry_get_text(GTK_ENTRY(port))))
		telco_set_port(atoi(gtk_entry_get_text(GTK_ENTRY(port))));
	telco_set_prefix(gtk_entry_get_text(GTK_ENTRY(prefix)));
	telco_clear_nbrc();
	telco_set_mode(tmpmode);
	row = 0;
#if 0
	while(gtk_clist_get_text(GTK_CLIST(nbrlist), row++, 0, &s) && s)
	{
		telco_register_nbrc(s);
	}
	telco_save_settings();
#endif	
	gtk_widget_destroy(telcobox);
	iax_reg();
}
#endif

static int telco_destroy(void)
{
	gtk_grab_remove(telcobox);
	telcobox = NULL;
	nct_frame = NULL;
	notebook = NULL;
	return TRUE;
}

static void telco_response(GtkWidget *w, int response, gpointer data)
{
	gtk_widget_destroy(w);
}
static void button_callback(GtkWidget *w, void *data)
{
	if (notebook)
		gtk_notebook_set_page(GTK_NOTEBOOK(notebook), (tmpmode = atoi((char *)data)));

	if (nct_frame) {
		if (tmpmode == TELCO_MODE_ASTERISK)
			gtk_widget_set_sensitive(GTK_WIDGET(nct_frame), FALSE);
		else
			gtk_widget_set_sensitive(GTK_WIDGET(nct_frame), TRUE);
	}
}

#if 0
static void check_entry(void)
{
	const gchar *s = NULL;
	s = gtk_entry_get_text(GTK_ENTRY(nbr));
	if (s && strlen(s)) 
		gtk_widget_set_sensitive(add, TRUE);
	else
		gtk_widget_set_sensitive(add, FALSE);
}

static void check_clist(void)
{
	if (GTK_CLIST(nbrlist)->selection) 
		gtk_widget_set_sensitive(rem, TRUE);
	else
		gtk_widget_set_sensitive(rem, FALSE);
}

static void add_callback(GtkWidget *w, void *data)
{
	const gchar *s;
	s = gtk_entry_get_text(GTK_ENTRY(nbr));
	if (s && strlen(s)) 
		gtk_clist_prepend(GTK_CLIST(nbrlist), s);
	gtk_entry_set_text(GTK_ENTRY(nbr), "");
}

static void rem_callback(GtkWidget *w, void *data)
{
	int row;
	if (!GTK_CLIST(nbrlist)->selection)
		return;
	row = (int)GTK_CLIST(nbrlist)->selection->data;
	gtk_clist_remove(GTK_CLIST(nbrlist), row);
	check_clist();
}

static void fill_nbrs(char *s, void *v)
{
	gtk_clist_prepend(GTK_CLIST(nbrlist), &s);
}
#endif

static int build_telco_gui(void)
{
	GtkWidget *table;
	GtkWidget *frame;
	GtkWidget *vbox;
	GtkWidget *label;
	GtkWidget *button;
	GtkWidget *hbox;
	GSList *gsl;
	char buf[80];

	tmpmode = telco_get_mode();

	telcobox = gtk_dialog_new();
/*	gtk_widget_realize(GTK_WIDGET(telcobox));*/
        gtk_window_set_title(GTK_WINDOW(telcobox), "Gnophone: Telephone settings");
        gtk_dialog_add_buttons(GTK_DIALOG(telcobox),
			"Accept", GTK_RESPONSE_ACCEPT,
			"Cancel", GTK_RESPONSE_REJECT,
			NULL);
	g_signal_connect(GTK_OBJECT(telcobox), "destroy", GTK_SIGNAL_FUNC(telco_destroy), NULL);
	g_signal_connect(GTK_OBJECT(telcobox), "response", GTK_SIGNAL_FUNC(telco_response), NULL);
				
	/* Start with some option buttons in a vbox */
	vbox = gtk_vbox_new(FALSE, 5);
	
	button = gtk_radio_button_new_with_label(NULL, "Do Nothing");
	gsl = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
	gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
	g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_callback), "0");
	button = gtk_radio_button_new_with_label(gsl, "Call with IAXtel");
	gsl = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
	gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
	
	if (tmpmode == TELCO_MODE_IAXTEL)
		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);

	g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_callback), "1");
	button = gtk_radio_button_new_with_label(gsl, "Use Asterisk");
	gsl = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
	gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
	if (tmpmode == TELCO_MODE_ASTERISK)
		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
	g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_callback), "2");

	/* Build a notebook, but we'll have no tabs on it */
	notebook = gtk_notebook_new();
	gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
	gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
	
	/* For no options, just make a label */
	label = gtk_label_new("This space intentionally left blank");
	gtk_widget_set_sensitive(label, FALSE);
	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), label, NULL);
	
	/* For IAXtel -- also nothing */
	label = gtk_label_new("IAXtel settings would go here.");
	gtk_widget_set_sensitive(label, FALSE);
	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), label, NULL);
	
	/* For an Asterisk server we have all the core stuff */
	table = gtk_table_new(4, 5, FALSE);
	label = gtk_label_new("Server:   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
	server = gtk_entry_new();
	gtk_entry_set_text(GTK_ENTRY(server), telco_get_server());
	gtk_table_attach_defaults(GTK_TABLE(table), server, 1, 3, 0, 1);

	label = gtk_label_new("Context:   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
	context = gtk_entry_new();
	gtk_entry_set_text(GTK_ENTRY(context), telco_get_context());
	gtk_table_attach_defaults(GTK_TABLE(table), context, 1, 3, 1, 2);

	snprintf(buf, sizeof(buf), "%d", telco_get_port());
	label = gtk_label_new("   Port:   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, 0, 1);
	port = gtk_entry_new();
	gtk_widget_set_usize(port, 50, 0);
	gtk_entry_set_text(GTK_ENTRY(port), buf);
	gtk_table_attach_defaults(GTK_TABLE(table), port, 4, 5, 0, 1);

	label = gtk_label_new("   Prefix:   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, 1, 2);
	prefix = gtk_entry_new();
	gtk_widget_set_usize(prefix, 50, 0);
	gtk_entry_set_text(GTK_ENTRY(prefix), telco_get_prefix());
	gtk_table_attach_defaults(GTK_TABLE(table), prefix, 4, 5, 1, 2);

	label = gtk_label_new("Username:   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
	username = gtk_entry_new();
	gtk_widget_set_usize(username, 100, 0);
	gtk_entry_set_text(GTK_ENTRY(username), telco_get_username());
	gtk_table_attach_defaults(GTK_TABLE(table), username, 1, 2, 2, 3);

	label = gtk_label_new("   Password:   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 2, 3);
	password = gtk_entry_new();
	gtk_widget_set_usize(password, 100, 0);
	gtk_entry_set_visibility(GTK_ENTRY(password), FALSE);
	gtk_entry_set_text(GTK_ENTRY(password), telco_get_password());
	gtk_table_attach_defaults(GTK_TABLE(table), password, 3, 5, 2, 3);

	label = gtk_label_new("Peer(optional):   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4);
	peer = gtk_entry_new();
	gtk_widget_set_usize(peer, 100, 0);
	gtk_entry_set_text(GTK_ENTRY(peer), telco_get_peer());
	gtk_table_attach_defaults(GTK_TABLE(table), peer, 1, 2, 3, 4);

	label = gtk_label_new("   Secret (optional):   ");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 3, 4);
	secret = gtk_entry_new();
	gtk_widget_set_usize(secret, 100, 0);
	gtk_entry_set_visibility(GTK_ENTRY(secret), FALSE);
	gtk_entry_set_text(GTK_ENTRY(secret), telco_get_secret());
	gtk_table_attach_defaults(GTK_TABLE(table), secret, 3, 5, 3, 4);

	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, NULL);

	/* Pick the right page */
	
	/* Put the options and the notebook in an hbox */
	hbox = gtk_hbox_new(FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 5);
	gtk_box_pack_start(GTK_BOX(hbox), notebook, FALSE, FALSE, 5);
	gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);

	/* Put all this in a frame, appropriately labed */
	frame = gtk_frame_new("How I should handle telephone numbers");
	gtk_container_add(GTK_CONTAINER(frame), hbox);

	/* Now make a vbox to hold this and the number complete templates */
	vbox = gtk_vbox_new(FALSE, 5);
	gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5);
	gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);

	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(telcobox)->vbox), vbox);
	/* And now the number complete templates */
/*	table = gtk_table_new(3, 3, FALSE);
	
	nbr = gtk_entry_new();
	gtk_widget_set_usize(button, 200, 0);
	gtk_table_attach(GTK_TABLE(table), nbr, 0, 1, 0, 1, 0, 0, 10, 10);
	gtk_signal_connect(GTK_OBJECT(nbr), "activate", GTK_SIGNAL_FUNC(add_callback), NULL);
	gtk_signal_connect(GTK_OBJECT(nbr), "changed", GTK_SIGNAL_FUNC(check_entry), NULL);                                                   

	add = button = gtk_button_new_with_label("Add");
	gtk_widget_set_usize(button, 80, 20);
	gtk_table_attach(GTK_TABLE(table), button, 1, 2, 0, 1, 0, 0, 10, 10);
	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(add_callback), NULL);
	gtk_widget_set_sensitive(add, FALSE);
	
	nbrlist = gtk_clist_new(1);
	gtk_clist_set_selection_mode(GTK_CLIST(nbrlist), GTK_SELECTION_BROWSE);
	sw = gtk_scrolled_window_new(NULL, NULL);
	gtk_widget_set_usize(sw, 0, 100);
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
	gtk_container_add(GTK_CONTAINER(sw), nbrlist);
	gtk_table_attach(GTK_TABLE(table), sw, 0, 1, 1, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 10, 10);
	gtk_signal_connect(GTK_OBJECT(nbrlist), "select_row", GTK_SIGNAL_FUNC(check_clist), NULL);                                                   

	rem = button = gtk_button_new_with_label("Remove");
	gtk_widget_set_usize(button, 80, 20);
	gtk_table_attach(GTK_TABLE(table), button, 1, 2, 1, 2, 0, 0, 10, 10);
	gtk_widget_set_sensitive(rem, FALSE);
	gtk_signal_connect(GTK_OBJECT(rem), "clicked", GTK_SIGNAL_FUNC(rem_callback), NULL);

	label = gtk_label_new(
"Number complete templates are how I know when you \
have finished dialing a phone number.  I consider the \
number complete, when it matches a pattern listed here. \
0 to 9, *, and # represent their respective keys on the keypad. \
The character 'N' means \"anything from 2 to 9\" while the \
character 'X' means \"any digit\".");
	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
	gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 0, 2);

	telco_iterate(fill_nbrs, NULL);

	nct_frame = gtk_frame_new("Number Complete Templates");
	
	if (tmpmode == TELCO_MODE_ASTERISK)
		gtk_widget_set_sensitive(GTK_WIDGET(nct_frame), FALSE);

	gtk_container_set_border_width(GTK_CONTAINER(table), 10);
	gtk_container_add(GTK_CONTAINER(nct_frame), table);	
	gtk_box_pack_start(GTK_BOX(vbox), nct_frame, FALSE, FALSE, 5);
*/
/*	hbox = gtk_hbox_new(FALSE, 5);

	button = image_button_new(telcobox, IMAGE_BUTTON_TYPE_BUTTON, "Cancel", cancel_xpm);
	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(telco_cancel), NULL);
	gtk_widget_set_usize(button, 100, -1);
	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);

	button = image_button_new(telcobox, IMAGE_BUTTON_TYPE_BUTTON, "Ok", ok_xpm);
	gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(telco_okay), NULL);
	gtk_widget_set_usize(button, 100, -1);
	gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 5);

	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);

	
	gtk_container_add(GTK_CONTAINER(telcobox), vbox);
*/

	return 0;
}

int telco_show_gui(void) 
{
	build_telco_gui();
	gtk_widget_show_all(telcobox);
	gtk_notebook_set_page(GTK_NOTEBOOK(notebook), tmpmode);
	gtk_grab_add(telcobox);
	while(telcobox && !gtk_main_iteration_do(TRUE));
	return 0;
}


