#!/usr/bin/gjs
const { Gtk, Gdk, Gio, GLib, GObject } = imports.gi;

Gtk.init(null);

// --- CONFIGURATIE ---
const DESKTOP_DIR = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP) || GLib.get_home_dir() + "/Desktop";

// --- HOOFDVENSTER ---
let win = new Gtk.Window({ type: Gtk.WindowType.TOPLEVEL, title: "Crystal Desktop" });
let screen = win.get_screen();
let monitor = screen.get_primary_monitor();
let geo = screen.get_monitor_geometry(monitor);

win.set_default_size(geo.width, geo.height);
win.set_type_hint(Gdk.WindowTypeHint.DESKTOP);
win.set_keep_below(true);
win.set_decorated(false);
win.set_app_paintable(true);

// Transparantie voor wallpaper
let visual = screen.get_rgba_visual();
if (visual) win.set_visual(visual);

// --- ICON GRID (FlowBox) ---
// We gebruiken een FlowBox die verticaal vult (Top-Down, dan naar rechts)
let iconGrid = new Gtk.FlowBox({
    orientation: Gtk.Orientation.VERTICAL,
    valign: Gtk.Align.START,
    halign: Gtk.Align.START,
    min_children_per_line: 1,
    max_children_per_line: 8, // Aantal iconen onder elkaar voordat nieuwe kolom begint
    selection_mode: Gtk.SelectionMode.NONE
});
iconGrid.set_column_spacing(20);
iconGrid.set_row_spacing(20);
iconGrid.set_margin_top(20);
iconGrid.set_margin_start(20);

// Container
let scroll = new Gtk.ScrolledWindow();
scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER); // Geen scrollbars zichtbaar
scroll.add(iconGrid);
win.add(scroll);

// --- HELPER: MAAK ICON ---
function createDesktopIcon(name, iconName, fileUri, isSpecial = false) {
    let btn = new Gtk.Button();
    btn.set_relief(Gtk.ReliefStyle.NONE); // Geen rand tenzij hover
    btn.get_style_context().add_class("desktop-icon");

    let box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL, spacing: 5 });
    
    // Icoon logic
    let image = new Gtk.Image({ pixel_size: 48 });
    if (iconName.startsWith("/")) {
        image.set_from_file(iconName); // Absoluut pad
    } else {
        image.set_from_icon_name(iconName, Gtk.IconSize.DIALOG); // Systeem icon
    }
    
    // Tekst logic (met schaduw via CSS)
    let label = new Gtk.Label({ label: name, max_width_chars: 12, ellipsize: 3, wrap: true });
    label.get_style_context().add_class("desktop-label");

    box.add(image);
    box.add(label);
    btn.add(box);

    // Actie bij dubbelklik
    btn.connect("clicked", () => {
        // Simuleer dubbelklik logic (GTK Button is normaal single click)
        // Voor nu: open direct. In productie zou je een timer checken.
        try {
            if (isSpecial) {
                GLib.spawn_command_line_async(`xdg-open "${fileUri}"`);
            } else {
                let file = Gio.File.new_for_uri(fileUri);
                // Laat het OS beslissen hoe het opent
                Gio.AppInfo.launch_default_for_uri(fileUri, null);
            }
        } catch (e) {
            logError(e);
        }
    });

    return btn;
}

// --- LADEN VAN ICONEN ---
function refreshIcons() {
    // Eerst alles verwijderen
    iconGrid.get_children().forEach(child => iconGrid.remove(child));

    // 1. Systeem Iconen (Windows Stijl)
    iconGrid.add(createDesktopIcon("Deze PC", "computer", "computer:///", true));
    iconGrid.add(createDesktopIcon("Persoonlijke Map", "user-home", GLib.get_home_dir(), true));
    iconGrid.add(createDesktopIcon("Prullenbak", "user-trash", "trash:///", true));

    // 2. Bestanden op Desktop uitlezen
    let dir = Gio.File.new_for_path(DESKTOP_DIR);
    try {
        let enumerator = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
        let next;
        while ((next = enumerator.next_file(null)) != null) {
            let fileName = next.get_name();
            if (fileName.startsWith(".")) continue; // Verberg hidden files

            let fileUri = dir.get_child(fileName).get_uri();
            let contentType = next.get_content_type();
            let icon = Gio.content_type_get_icon(contentType);
            
            // Probeer een mooi icoon te krijgen, fallback naar generiek
            let iconStr = icon.to_string(); 
            // Fix voor GIcon conversie string (soms ingewikkeld in GJS)
            if (iconStr.includes(" ")) iconStr = "text-x-generic"; 

            iconGrid.add(createDesktopIcon(fileName, iconStr, fileUri));
        }
    } catch (e) {
        // Map bestaat misschien niet, negeren
    }
    
    iconGrid.show_all();
}

// --- CONTEXT MENU (Rechtermuisknop) ---
let menu = new Gtk.Menu();
let itemTerm = new Gtk.MenuItem({ label: "Terminal openen" });
itemTerm.connect("activate", () => GLib.spawn_command_line_async("gnome-terminal"));
menu.append(itemTerm);

let itemRefresh = new Gtk.MenuItem({ label: "Vernieuwen" });
itemRefresh.connect("activate", refreshIcons);
menu.append(itemRefresh);

let itemSettings = new Gtk.MenuItem({ label: "Aanpassen aan beeldscherm" });
itemSettings.connect("activate", () => GLib.spawn_command_line_async("gnome-control-center display"));
menu.append(itemSettings);

menu.show_all();

// Klik detectie op de achtergrond
win.add_events(Gdk.EventMask.BUTTON_PRESS_MASK);
win.connect("button-press-event", (widget, event) => {
    if (event.get_button()[1] === 3) { // Rechtermuisknop
        menu.popup_at_pointer(event);
        return true;
    }
    return false;
});

// Initialiseer en start
refreshIcons();

// Monitor voor wijzigingen (Als je een bestand opslaat op bureaublad, verschijnt het direct)
let fileMonitor = Gio.File.new_for_path(DESKTOP_DIR).monitor_directory(Gio.FileMonitorFlags.NONE, null);
fileMonitor.connect("changed", () => {
    // Kleine delay om te voorkomen dat hij te snel refresh tijdens schrijven
    GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => {
        refreshIcons();
        return false;
    });
});

win.connect("destroy", () => Gtk.main_quit());
win.show_all();
Gtk.main();
