#include <gtk/gtk.h>
#include <webkit2/webkit2.h>

static void show_about_dialog(GtkWidget *widget, gpointer data) {
    GtkWidget *dialog = gtk_about_dialog_new();
    gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), "Simple Browser");
    gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "1.0");
    gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), "A simple GTK3 WebKit2 based browser");
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
}

static void go_back(GtkWidget *widget, WebKitWebView *web_view) {
    g_print("Back button clicked\n");
    if (webkit_web_view_can_go_back(web_view)) {
        g_print("Going back\n");
        webkit_web_view_go_back(web_view);
    } else {
        g_print("Cannot go back\n");
    }
}

static void go_forward(GtkWidget *widget, WebKitWebView *web_view) {
    g_print("Forward button clicked\n");
    if (webkit_web_view_can_go_forward(web_view)) {
        g_print("Going forward\n");
        webkit_web_view_go_forward(web_view);
    } else {
        g_print("Cannot go forward\n");
    }
}

static void zoom_in(GtkWidget *widget, WebKitWebView *web_view) {
    gdouble zoom_level = webkit_web_view_get_zoom_level(web_view);
   zoom_level += 0.1;
       webkit_web_view_set_zoom_level(web_view, zoom_level);
    g_print("Zoomed in. New zoom level: %.1f\n", zoom_level);
}

static void zoom_out(GtkWidget *widget, WebKitWebView *web_view) {
    gdouble zoom_level = webkit_web_view_get_zoom_level(web_view);
    zoom_level -= 0.1;
    webkit_web_view_set_zoom_level(web_view, zoom_level);
    g_print("Zoomed out. New zoom level: %.1f\n", zoom_level);
}


static void print_web_view(GtkWidget *widget, WebKitWebView *web_view) {
    WebKitPrintOperation *print_operation = webkit_print_operation_new(web_view);
    webkit_print_operation_run_dialog(print_operation, GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(web_view))));
    g_object_unref(print_operation);
}

static void save_web_view_callback(GObject *source_object, GAsyncResult *res, gpointer user_data) {
    WebKitJavascriptResult *js_result;
    GError *error = NULL;

    js_result = webkit_web_view_run_javascript_finish(WEBKIT_WEB_VIEW(source_object), res, &error);
    if (!js_result) {
        g_print("Error running JavaScript: %s\n", error->message);
        g_error_free(error);
        return;
    }

    JSCValue *value = webkit_javascript_result_get_js_value(js_result);
    if (jsc_value_is_string(value)) {
        gchar *str_value = jsc_value_to_string(value);
        gchar *filename = (gchar *)user_data;

        if (g_file_set_contents(filename, str_value, -1, &error)) {
            g_print("File saved successfully: %s\n", filename);
        } else {
            g_print("Error saving file: %s\n", error->message);
            g_error_free(error);
        }

        g_free(str_value);
        g_free(filename);
    }

    webkit_javascript_result_unref(js_result);
}

static void save_web_view(GtkWidget *widget, WebKitWebView *web_view) {
    g_print("Save function called\n");

    GtkWidget *dialog;
    GtkFileChooser *chooser;
    GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
    gint res;

    dialog = gtk_file_chooser_dialog_new("Save File",
                                         GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(web_view))),
                                         action,
                                         "_Cancel",
                                         GTK_RESPONSE_CANCEL,
                                         "_Save",
                                         GTK_RESPONSE_ACCEPT,
                                         NULL);
    chooser = GTK_FILE_CHOOSER(dialog);

    gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);

    gtk_file_chooser_set_current_name(chooser, "webpage.html");

    g_print("File chooser dialog created\n");

    res = gtk_dialog_run(GTK_DIALOG(dialog));
    if (res == GTK_RESPONSE_ACCEPT) {
        char *filename;
        filename = gtk_file_chooser_get_filename(chooser);
        g_print("Selected filename: %s\n", filename);

        const char *script = "document.documentElement.outerHTML;";
        webkit_web_view_run_javascript(web_view, script, NULL, save_web_view_callback, g_strdup(filename));

        g_print("Save operation initiated\n");
    } else {
        g_print("Save operation cancelled\n");
    }

    gtk_widget_destroy(dialog);
    g_print("Save function completed\n");
}

static void update_address_bar(WebKitWebView *web_view, GtkWidget *address_bar) {
    const gchar *uri = webkit_web_view_get_uri(web_view);
    if (uri) {
        gtk_entry_set_text(GTK_ENTRY(address_bar), uri);
    }
}

static void web_view_load_changed(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer user_data) {
    if (load_event == WEBKIT_LOAD_FINISHED) {
        update_address_bar(web_view, GTK_WIDGET(user_data));
    }
}


static void load_url(GtkEntry *entry, gpointer user_data) {
    const gchar *url = gtk_entry_get_text(entry);
    g_print("Loading URL: %s\n", url);

    if (g_str_has_prefix(url, "http://") || g_str_has_prefix(url, "https://")) {
        webkit_web_view_load_uri(WEBKIT_WEB_VIEW(user_data), url);
    } else {
        gchar *search_url = g_strdup_printf("https://www.google.com/search?q=%s", url);
        webkit_web_view_load_uri(WEBKIT_WEB_VIEW(user_data), search_url);
        g_free(search_url);
    }
}

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
     
    
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *menubar;
    GtkWidget *filemenu;
    GtkWidget *file;
    GtkWidget *save;
    GtkWidget *print;
    GtkWidget *quit;
    GtkWidget *helpmenu;
    GtkWidget *help;
    GtkWidget *about;
    GtkWidget *toolbar;
    GtkToolItem *back_button;
    GtkToolItem *forward_button;
    GtkToolItem *zoom_in_button;
    GtkToolItem *zoom_out_button;
    GtkWidget *address_bar;
    GtkWidget *web_view;


    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
    gtk_window_set_title(GTK_WINDOW(window), "Simple Browser");


    vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);


    menubar = gtk_menu_bar_new();
    filemenu = gtk_menu_new();
    helpmenu = gtk_menu_new();

    file = gtk_menu_item_new_with_label("File");
    save = gtk_menu_item_new_with_label("Save");
    print = gtk_menu_item_new_with_label("Print");
    quit = gtk_menu_item_new_with_label("Quit");
    help = gtk_menu_item_new_with_label("Help");
    about = gtk_menu_item_new_with_label("About");

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), save);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), print);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);

    gtk_menu_item_set_submenu(GTK_MENU_ITEM(help), helpmenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(helpmenu), about);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), help);

    gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);


    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);


    back_button = gtk_tool_button_new(gtk_image_new_from_icon_name("go-previous", GTK_ICON_SIZE_SMALL_TOOLBAR), "Back");
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), back_button, -1);


    forward_button = gtk_tool_button_new(gtk_image_new_from_icon_name("go-next", GTK_ICON_SIZE_SMALL_TOOLBAR), "Forward");
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), forward_button, -1);
    

    zoom_in_button = gtk_tool_button_new(gtk_image_new_from_icon_name("zoom-in", GTK_ICON_SIZE_SMALL_TOOLBAR), "Zoom In");
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom_in_button, -1);

    zoom_out_button = gtk_tool_button_new(gtk_image_new_from_icon_name("zoom-out", GTK_ICON_SIZE_SMALL_TOOLBAR), "Zoom Out");
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom_out_button, -1);

 


    address_bar = gtk_entry_new();
    GtkToolItem *address_item = gtk_tool_item_new();
    gtk_container_add(GTK_CONTAINER(address_item), address_bar);
    gtk_tool_item_set_expand(address_item, TRUE);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), address_item, -1);


    gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);


    web_view = webkit_web_view_new();


    gtk_box_pack_start(GTK_BOX(vbox), web_view, TRUE, TRUE, 0);


    g_signal_connect(back_button, "clicked", G_CALLBACK(go_back), web_view);
    g_signal_connect(forward_button, "clicked", G_CALLBACK(go_forward), web_view);
    g_signal_connect(zoom_in_button, "clicked", G_CALLBACK(zoom_in), web_view);
    g_signal_connect(zoom_out_button, "clicked", G_CALLBACK(zoom_out), web_view);
    g_signal_connect(address_bar, "activate", G_CALLBACK(load_url), web_view);
    g_signal_connect(about, "activate", G_CALLBACK(show_about_dialog), NULL);
    g_signal_connect(print, "activate", G_CALLBACK(print_web_view), web_view);
    g_signal_connect(save, "activate", G_CALLBACK(save_web_view), web_view);
    g_signal_connect(quit, "activate", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    g_signal_connect(web_view, "load-changed", G_CALLBACK(web_view_load_changed), address_bar);

    webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_view), "https://www.google.com");
    
    update_address_bar(WEBKIT_WEB_VIEW(web_view), address_bar);
     
    gtk_widget_show_all(window);

    g_print("Starting GTK main loop\n");
    gtk_main();

    return 0;
}
