




// modul-globale Variablen
let toastElement = null;

//const spinnerElement = document.getElementById('loading-spinner');
let spinnerElement = null;
let spinnerTextCounter = null;


/**
 * Zeigt den übergebenen String und ggf. den Parameter für kurze Zeit als Info an.
 * Das Toast-Element wird einmalig erstellt und dann wiederverwendet.
 * @param message Der Infotext
 * @param details Optionaler Detailtext
 */
export function showToast(message, details = "") {
  // Erstelle das Toast-Element, falls es noch nicht existiert
  if (!toastElement) {
    toastElement = document.createElement('div');
    toastElement.id = 'toast-message'; // Gib dem Toast-Element eine ID für CSS
    // Füge grundlegende Styles direkt hinzu, damit es sichtbar ist
    toastElement.style.cssText = `
      visibility: hidden;
      min-width: 250px;
      margin-left: -125px; /* Zentrieren */
      background-color: #333;
      color: #fff;
      text-align: center;
      border-radius: 2px;
      padding: 16px;
      position: fixed;
      z-index: 99999; /* Stelle sicher, dass es über allem liegt */
      left: 50%;
      bottom: 50%;
      font-size: 17px;
      white-space: pre-wrap; /* Für mehrzeilige Nachrichten */
      opacity: 0; /* Für den Fade-Effekt */
      transition: opacity 0.5s ease-in-out; /* Übergang für Fade */
    `;
    document.body.appendChild(toastElement);
  }

  const fullMessage = details ? `${message}\n${details}` : message;
  toastElement.textContent = fullMessage;
  toastElement.style.visibility = 'visible'; // Zeige den Toast an
  toastElement.style.opacity = 1; // Blende ihn ein

  // Blende den Toast nach 3 Sekunden wieder aus
  setTimeout(() => {
    toastElement.style.opacity = 0; // Blende ihn aus
    // Verstecke das Element nach dem Ausblenden vollständig
    setTimeout(() => {
      toastElement.style.visibility = 'hidden';
    }, 600); // Muss länger sein als die CSS-Transition
  }, 500); // Anzeigedauer
}
/**
 * Abhängig vom pfad des Soucecodes können funktionen anders agieren (zB laden des backendservice, Anzeige der genauen update zeit im marker popup im DEVELOPMENT )
 * @returns 
 */
export function is_development() {
  let path = window.location.pathname;

  return window.location.pathname.includes("DEVELOPMENT"); 
}

// baut eine definierbare verzögerung ein, zB wenn eine race condition vermieden werden muss, wie beim klick von einem geöffnete cluster auf ein anderes
export function wait(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
 // Holt den aktuellen Timestamp
export function getCurrentTimestamp() {
  return new Date().toISOString(); // ISO 8601 Format
}
// Temporäre getCurrentUser-Funktion. 
// Holt den Benutzernamen aus dem LocalStorage
export function getCurrentUser() {
  const username = localStorage.getItem('username');
  if (username) {
    return username;
  } else {
    console.error('Benutzername nicht im LocalStorage gefunden!');
    return 'Unbekannt'; // Fallback-Wert
  }
}
// Fügen Sie diese neue Funktion zu Ihrer sc-utilities.js hinzu oder direkt in die Datei:
export function forceRedraw() {
    return new Promise(resolve => {
        // Fordert den Browser auf, vor der nächsten Ausführung den Frame neu zu zeichnen.
        requestAnimationFrame(() => {
            // Eine zusätzliche kleine setTimeout-Verzögerung kann bei manchen mobilen OS helfen,
            // die Render-Priorität zu erzwingen.
            setTimeout(resolve, 0); 
        });
    });
}
/**
* Erzeugt ein Promise, das nach einer bestimmten Zeit ablehnt.
* @param {number} ms Die Zeit in Millisekunden.
* @returns {Promise<never>} Ein ablehnendes Promise.
*/
export function timeoutPromise(ms) {
  return new Promise((_, reject) =>
    setTimeout(() => reject(new Error(`Timeout nach ${ms}ms`)), ms)
  );
}

/**
 * Distanzprüfung zwischen Nutzer- und Zielort, 
 * maxDistance als Toleranzschwelle
 * @param userposition und Steinposition
 */
export function checkDistance( //
  userLat,
  userLon,
  itemLat,
  itemLon,
  maxDistance = 600000
) {
  // debugger;
  if (userLat == null || userLon == null || itemLat == null || itemLon == null) {
    console.warn("Mindestens ein Wert ist null oder undefined");
    return null;
  }

  // Überprüfen, ob die Benutzer-Koordinaten gültig sind
  if (!isNaN(userLat) && !isNaN(userLon)) {
    const userPosition = L.latLng(userLat, userLon);
    const selectedLocation = L.latLng(itemLat, itemLon);

    // Berechne die Distanz zwischen den beiden Punkten
    const distance = userPosition.distanceTo(selectedLocation);

    // Wenn die Distanz größer als maxDistance ist, zeige eine Benachrichtigung und blende die Felder aus
    if (distance > maxDistance) {
      return false; // Distanz zu groß
    }

    return true; // Distanz in Ordnung
  }

  return false; // Ungültige Benutzer-Koordinaten
}

export function mylog(...args) {
    const timestamp = new Date().toLocaleString('de-DE', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        fractionalSecondDigits: 3,
        hour12: false
    });
    console.log(`[${timestamp}]`, ...args);
}




/**
 * Aktualisiert den Text im Lade-Spinner.
 * @param {string} text - Der anzuzeigende Text.
 */
export function updateSpinner(text) { // NEUE EXPORTIERTE FUNKTION
const textElement = document.querySelector('#loading-spinner-content p');
    if (textElement) {
        textElement.textContent = text;
    }
    mylog("Spinner Text aktualisiert:", text);
}
