const Notifications = await Service.import('notifications');

const { Box } = Widget;
const { interval } = Utils;

const { GLib } = imports.gi;

import { Notification } from './base.ts';

const DELAY = 2000;

// Types
import { NotifGesture } from 'global-types';


export default () => Box({
    vertical: true,
    // Needed so it occupies space at the start
    css: 'padding: 1px;',

    setup: (self) => {
        const addPopup = (id: number) => {
            if (!id) {
                return;
            }

            const notif = Notifications.getNotification(id);

            if (notif) {
                const NewNotif = Notification({
                    notif,
                    command: () => {
                        if (notif.popup) {
                            notif.dismiss();
                        }
                    },
                });

                if (NewNotif) {
                    // Use this instead of add to put it at the top
                    self.pack_end(NewNotif, false, false, 0);
                    self.show_all();
                }
            }
        };

        const handleDismiss = (id: number, force = false) => {
            const notif = (self.children as NotifGesture[])
                .find((ch) => ch.attribute.id === id);

            if (!notif) {
                return;
            }

            console.log(notif.attribute.hovered);

            // If notif isn't hovered or was closed, slide away
            if (!notif.attribute.hovered || force) {
                notif.attribute.slideAway('Left');
            }

            // If notif is hovered, delay close
            else if (notif.attribute.hovered) {
                const intervalId = interval(DELAY, () => {
                    if (!notif.attribute.hovered && intervalId) {
                        notif.attribute.slideAway('Left');

                        GLib.source_remove(intervalId);
                    }
                });
            }
        };

        self
            .hook(Notifications, (_, id) => addPopup(id), 'notified')
            .hook(Notifications, (_, id) => handleDismiss(id), 'dismissed')
            .hook(Notifications, (_, id) => handleDismiss(id, true), 'closed');
    },
});