/**
 * @fileoverview visibility-tracker.js
 * Optimierte Version mit Re-Entry Guard, um Mehrfach-Trigger zu verhindern.
 * Der Code definiert eine JavaScript-Klasse VisibilityTracker, die erkennt, wann eine Webseite verlassen und wieder betreten wird – und wie lange der Nutzer weg war.
Diese Zeit wird dann über eine Callback-Funktion zurückgegeben. in app-gen-co wird auf dieser Basis aktuell refreshPois() aufgerufen, damit der user keinen uralten stand sieht
 */
export class VisibilityTracker {
    #hiddenAt = null;
    #onReEntryCallback = null;
    #isProcessing = false; // Sperre gegen Mehrfach-Trigger

    constructor(onReEntryCallback) {
        this.#onReEntryCallback = onReEntryCallback;
        this.#init();
    }

    #init() {
        const hide = (s) => this.#onHidden(s);
        const show = (s) => this.#onVisible(s);

        document.addEventListener('visibilitychange', () => {
            document.visibilityState === 'hidden' ? hide('visibility') : show('visibility');
        }, { capture: true });

 //       window.addEventListener('blur', () => hide('blur'), { capture: true });
  //      window.addEventListener('focus', () => show('focus'), { capture: true });

        window.addEventListener('pagehide', (e) => 
            hide('pagehide' + (e.persisted ? '(bfc)' : '')), { capture: true });
        
        window.addEventListener('pageshow', (e) => 
            show('pageshow' + (e.persisted ? '(bfc)' : '')), { capture: true });
    }

    #onHidden(source) {
        if (this.#hiddenAt !== null) return; 
        this.#hiddenAt = performance.now();
    }

    #onVisible(source) {
        // Falls wir gerade erst einen Re-Entry verarbeitet haben oder gar nicht weg waren: Abbruch.
        if (this.#isProcessing || this.#hiddenAt === null) return;

        this.#isProcessing = true; // Sperre setzen
        
        const durationMs = performance.now() - this.#hiddenAt;
        this.#hiddenAt = null; // Zeitstempel sofort löschen

        const diffSec = durationMs / 1000;
        
        if (this.#onReEntryCallback) {
            this.#onReEntryCallback(diffSec, source);
        }

        // Nach 200ms die Sperre wieder aufheben (genug Zeit für alle Event-Säulen)
        setTimeout(() => {
            this.#isProcessing = false;
        }, 200);
    }
}