/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public License as
 * published by the ree 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
 * Library General Public License for more details.
 *
 * Copyright (C) 2018 - 2021 Red Hat, Inc.
 */

#include "nm-default.h"
#include "nma-private.h"

#include <gtk/gtk.h>
#include "nma-bar-code-widget.h"

static gboolean
delete (GMainLoop *main_loop)
{
	g_main_loop_quit (main_loop);
	return FALSE;
}

static void
ssid_changed (GtkEditable *editable, gpointer user_data)
{
	NMConnection *connection = NM_CONNECTION (user_data);
	NMSettingWireless *s_wireless = nm_connection_get_setting_wireless (connection);
	gs_unref_bytes GBytes *ssid = NULL;
	GtkEntryBuffer *buffer;

	g_return_if_fail (s_wireless);

	buffer = gtk_entry_get_buffer (GTK_ENTRY (editable));
	ssid = g_bytes_new_static (gtk_entry_buffer_get_text (buffer),
	                           gtk_entry_buffer_get_bytes (buffer));

	g_object_set (s_wireless,
	              NM_SETTING_WIRELESS_SSID, ssid,
	              NULL);
}

static void
password_changed (GtkEditable *editable, gpointer user_data)
{
	NMConnection *connection = NM_CONNECTION (user_data);
	NMSettingWirelessSecurity *s_wsec = nm_connection_get_setting_wireless_security (connection);

	if (!s_wsec)
		return;

	g_object_set (s_wsec,
	              NM_SETTING_WIRELESS_SECURITY_PSK,
	              gtk_editable_get_text (editable),
	              NULL);
}

static void
key_mgmt_changed (GtkComboBox *combo_box, gpointer user_data)
{
	NMConnection *connection = NM_CONNECTION (user_data);
	const char *key_mgmt = gtk_combo_box_get_active_id (combo_box);
	NMSettingWirelessSecurity *s_wsec = nm_connection_get_setting_wireless_security (connection);
	GtkWidget *pass = g_object_get_data (G_OBJECT (combo_box), "pass");

	if (!key_mgmt) {
		nm_connection_remove_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY);
		gtk_widget_set_sensitive (pass, FALSE);
		return;
	}

	if (!s_wsec) {
		s_wsec = NM_SETTING_WIRELESS_SECURITY (nm_setting_wireless_security_new ());
		nm_connection_add_setting (connection, NM_SETTING (s_wsec));
		gtk_widget_set_sensitive (pass, TRUE);
		password_changed (GTK_EDITABLE (pass), connection);
	}

	g_object_set (s_wsec,
	              NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, key_mgmt,
	              NULL);
}

int
main (int argc, char *argv[])
{
	GMainLoop *loop;
	GtkWidget *w, *pass;
	GtkWidget *grid;
	NMConnection *connection = NULL;
	gs_unref_bytes GBytes *ssid = g_bytes_new_static ("\"ab:cd\"", 13);

	connection = nm_simple_connection_new ();
	nm_connection_add_setting (connection,
		g_object_new (NM_TYPE_SETTING_CONNECTION,
		              NM_SETTING_CONNECTION_ID, "fifik",
		              NULL));
	nm_connection_add_setting (connection,
	                           nm_setting_wireless_new ());

	gtk_init ();

	w = gtk_window_new ();
	gtk_widget_show (w);
	gtk_window_set_default_size (GTK_WINDOW (w), 800, 680);

	loop = g_main_loop_new (NULL, FALSE);
#if GTK_CHECK_VERSION(4,0,0)
	g_signal_connect_swapped (w, "close-request", G_CALLBACK (delete), loop);
#else
	g_signal_connect_swapped (w, "delete-event", G_CALLBACK (delete), loop);
#endif

	grid = gtk_grid_new ();
	gtk_widget_show (grid);
	gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
	gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
	g_object_set (grid,
	              "margin_start", 6,
	              "margin_end", 6,
	              "margin_top", 6,
	              "margin_bottom", 6,
	              NULL);
	gtk_window_set_child (GTK_WINDOW (w), grid);

	w = gtk_label_new ("SSID");
	gtk_widget_show (w);
	g_object_set (w, "xalign", 1.0, NULL);
	gtk_grid_attach (GTK_GRID (grid), w, 0, 0, 1, 1);

	w = gtk_entry_new ();
	g_signal_connect (w, "changed", G_CALLBACK (ssid_changed), connection);
	gtk_editable_set_text (GTK_EDITABLE (w), "\"ab:cd\"");
	gtk_widget_show (w);
	gtk_grid_attach (GTK_GRID (grid), w, 1, 0, 1, 1);

	w = gtk_label_new ("Password");
	gtk_widget_show (w);
	g_object_set (w, "xalign", 1.0, NULL);
	gtk_grid_attach (GTK_GRID (grid), w, 0, 1, 1, 1);

	pass = gtk_entry_new ();
	g_signal_connect (pass, "changed", G_CALLBACK (password_changed), connection);
	gtk_editable_set_text (GTK_EDITABLE (pass), "lolofon");
	gtk_widget_show (pass);
	gtk_grid_attach (GTK_GRID (grid), pass, 1, 1, 1, 1);

	w = gtk_label_new ("Key Management");
	gtk_widget_show (w);
	g_object_set (w, "xalign", 1.0, NULL);
	gtk_grid_attach (GTK_GRID (grid), w, 0, 2, 1, 1);

	w = gtk_combo_box_text_new ();
	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (w), NULL, "No Password");
	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (w), "none", "WEP: none");
	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (w), "ieee8021x", "WEP: ieee8021x");
	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (w), "wpa-none", "WPA: wpa-none");
	gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (w), "wpa-psk", "WPA: wpa-psk");
	g_object_set_data (G_OBJECT (w), "pass", pass);
	g_signal_connect (w, "changed", G_CALLBACK (key_mgmt_changed), connection);
	gtk_combo_box_set_active_id (GTK_COMBO_BOX (w), "wpa-psk");
	gtk_widget_show (w);
	gtk_grid_attach (GTK_GRID (grid), w, 1, 2, 1, 1);

	w = nma_bar_code_widget_new (connection);
	gtk_widget_show (w);
	gtk_widget_set_vexpand (w, TRUE);
	gtk_widget_set_hexpand (w, TRUE);
	gtk_grid_attach (GTK_GRID (grid), w, 0, 3, 2, 1);

	g_main_loop_run (loop);
	g_main_loop_unref (loop);
}
