Source: media/data/LightboxData.js

import { GridDataFiltered } from "./GridDataFiltered.js";
import { PopupRenderer } from "../../map/popup/PopupRenderer.js";
export { LightboxData }

/**
 * Class representing lightbox data.
 */
class LightboxData extends GridDataFiltered {

    /**
     * Create a lightbox data object.
     * @param {Object} galleryConfigDict - Gallery configuration dictionary.
     */
    constructor(galleryConfigDict) {
        super(galleryConfigDict)
    }

    /**
     * Get the shown position of an item inside the lightbox by index.
     * @param {Number} index - Data index.
     * @returns Promise containing the gallery index.
     */
    shownItemPosition(index) {
        return this.galleryItems.slice(0, index).reduce((acc, curr, index) => {
            if (curr != null && 'numItemsOnSlide' in curr)
                return acc + curr['numItemsOnSlide']
            return acc + 1
        }, 1)
    }

    /**
     * Based on a buffer for adjacent items, check if an item is completely loaded.
     * @param {Number} index - Item index.
     * @param {Array} bufferSize - Number of previous and subsequent items, that should be checked too. 
     * @returns True or false, depending on whether the condition is met.
     */
    isItemCompletelyLoaded(index, bufferSize = [0, 0]) {
        const [bufferIndices, isBufferItemLoadedList] = this._getBufferInfo(index, bufferSize);
        return isBufferItemLoadedList.every(item => item === true)
    }

    /**
     * Based on a buffer for adjacent items, get an lightbox data item. 
     * @param {Number} indexC - Item index. If negative, reverse is activated.
     * @param {Array} bufferSize - Adjacent items that should be loaded too.
     * @returns Promise containing the item and its index.
     */
    getItem(indexC, bufferSize = [0, 0]) {
        const reversed = indexC < 0 ? true : false;
        const indexP = this._getGalleryItemIndex(indexC);
        let [startIndexP, count] = this._bufferHelper(indexP, bufferSize);

        const [indicesLeftFromStartIndex,] = this._getBufferInfo(indexC, [bufferSize[0], 0]);
        const observeShift = indicesLeftFromStartIndex.includes(startIndexP);

        if (count != 0) {
            startIndexP = this.gallerySourceIndices.length == 0 ? indexP : startIndexP;
            return this.loadItems(startIndexP, count, reversed).then((updatedIndexP) => {
                let newIndexC = indexP;
                if (observeShift) {
                    const indexShift = startIndexP - updatedIndexP;
                    newIndexC = indexP - indexShift;
                    if (reversed && newIndexC > 0)
                        newIndexC = newIndexC - this.galleryItemAmount;
                }
                return this.getItem(newIndexC, bufferSize)
            })
        }
        else {
            return Promise.resolve([this.galleryItems.at(indexC), this._getGalleryItemIndex(indexC)])
        }
    }

    /**
     * Get the sidebar template.
     * @returns Promise containing the sidebar template.
     */
    getSidebarTemplate() {
        if (this.metadataTemplate)
            return Promise.resolve(this.metadataTemplate)
        return PopupRenderer.fetchTemplate(this.adapter.metadataTemplateUrl)
    }

    /**
     * Get the share link for a specific item based on the index.
     * @param {Number} index - Item index.
     * @returns {String|undefined} URL of the gallery site containing the shared item identifier as query parameter.
     */
    getShareLink(index) {
        const shareID = this.galleryItems[index]?.['pid'];
        if (!shareID)
            return undefined
        const searchParams = new URLSearchParams(window.location.search)
        searchParams.set("shareID", shareID);
        const shareLink = window.location.origin + window.location.pathname + '?' + decodeURIComponent(searchParams.toString());
        return shareLink
    }
}