#include <gtk/gtk.h>
#include "service_status.h"

static void on_refresh_button_clicked(GtkButton *button, gpointer user_data);

static void activate(GtkApplication *app, gpointer user_data)
{
    GtkBuilder *builder =
        gtk_builder_new_from_resource("/com/example/demo/ui.ui");

    GtkWidget *window = GTK_WIDGET(
        gtk_builder_get_object(builder, "main_window"));
    gtk_window_set_application(GTK_WINDOW(window), app);


    /* store the builder on the app so callbacks can access it; the destroy notify
     * will unref it when the application is destroyed. Do NOT unref the builder
     * here - that would free it prematurely and cause callbacks to use a
     * dangling pointer.
     */
    g_object_set_data_full(G_OBJECT(app), "builder", builder, (GDestroyNotify)g_object_unref);

    /* populate the services listview (best-effort) */
    service_status_populate(builder);

    /* wire refresh button */
    GtkWidget *refresh_button = GTK_WIDGET(gtk_builder_get_object(builder, "refresh_button"));
    if (refresh_button) {
        g_signal_connect(refresh_button, "clicked", G_CALLBACK(on_refresh_button_clicked), app);
    }
    gtk_window_present(GTK_WINDOW(window));

}

static void on_refresh_button_clicked(GtkButton *button, gpointer user_data)
{
    GtkApplication *app = GTK_APPLICATION(user_data);
    GtkBuilder *builder = GTK_BUILDER(g_object_get_data(G_OBJECT(app), "builder"));
    if (builder) service_status_populate(builder);
}

int main(int argc, char *argv[])
{
    GtkApplication *app = gtk_application_new(
        "com.example.GtkResourceDemo",
        G_APPLICATION_DEFAULT_FLAGS);

    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);

    int status = g_application_run(G_APPLICATION(app), argc, argv);

    g_object_unref(app);
    return status;
}
