import { merge } from "ts-deepmerge";
import { get, readable, type Updater } from "svelte/store";
import type { OngoingQueueItem, QueueItem } from "$lib/types/queue";

type Queue = {
    [id: string]: QueueItem;
}

type OngoingQueue = {
    [id: string]: OngoingQueueItem;
}

let update: (_: Updater<Queue>) => void;

const queue = readable<Queue>(
    {},
    (_, _update) => { update = _update }
);

export function addToQueue(item: QueueItem) {
    update(queueData => {
        queueData[item.id] = item;
        return queueData;
    });
}

export function removeFromQueue(id: string) {
    update(queueData => {
        delete queueData[id];
        return queueData;
    });
}

let updateOngoing: (_: Updater<OngoingQueue>) => void;

const ongoingQueue = readable<OngoingQueue>(
    {},
    (_, _update) => { updateOngoing = _update }
);

export function updateOngoingQueue(id: string, itemInfo: Partial<OngoingQueueItem> = {}) {
    updateOngoing(queueData => {
        if (get(queue)?.id) {
            queueData[id] = merge(queueData[id], {
                id,
                ...itemInfo,
            });
        }

        return queueData;
    });
}

export function removeFromOngoingQueue(id: string) {
    updateOngoing(queue => {
        delete queue[id];
        return queue;
    });
}

export function nukeEntireQueue() {
    update(() => {
        return {};
    });
    updateOngoing(() => {
        return {};
    });
}

export { queue, ongoingQueue };