// /utils/loadWindowVariables.ts

// ✅ Interface für `window`-Objekt zur TypeScript-Sicherheit
interface CustomWindow extends Window {
  [key: string]: any;
}

// ✅ Hauptfunktion zum Laden von `window`-Variablen
export async function loadWindowVariables(): Promise<Record<string, any>> {
  return new Promise((resolve, reject) => {
    const requiredVars: string[] = ["win_deviceName"];
    const isDev = window.location.hostname === "localhost";

    // ✅ Skripte, die geladen werden müssen
    const scripts: string[] = [
      isDev ? "analogeEingaengeAPIHandler" : "ae.js",
      isDev ? "digitaleEingaengeAPIHandler" : "de.js",
      //isDev ? "digitalOutputsAPIHandler" : "da.js", // das wird Momentan nicht gebraucht
      isDev ? "kabelueberwachungAPIHandler" : "kueData.js",
      isDev ? "last20MessagesAPIHandler" : "start.js",
      isDev ? "opcuaAPIHandler" : "opcua.js",
      //isDev ? "slotDataAPIHandler" : "slotData.js", // das wird Momentan nicht gebraucht
      isDev ? "systemAPIHandler" : "system.js",
      //isDev ? "tdmDataAPIHandler" : "tdmData.js", // das wird Momentan nicht gebraucht
      //isDev ? "tdrDataAPIHandler" : "tdrData.js", // das wird Momentan nicht gebraucht
    ];

    // ✅ Erkenne Umgebung anhand von `window.location.hostname`

    const loadScript = (src: string): Promise<void> => {
      return new Promise((resolve, reject) => {
        const script = document.createElement("script");
        script.src = isDev
          ? `/api/cpl/${src}` // Entwicklungsumgebung
          : `/CPL?/CPL/SERVICE/${src}`; // Produktionsumgebung
        script.async = true;
        script.onload = () => resolve();
        script.onerror = () => reject(new Error(`Script load error: ${src}`));
        document.head.appendChild(script);
      });
    };

    // ✅ Lade alle Skripte nacheinander
    scripts
      .reduce(
        (promise, script) => promise.then(() => loadScript(script)),
        Promise.resolve()
      )
      .then(() => {
        const win = window as unknown as CustomWindow;

        // ✅ Erstelle ein Objekt mit allen geladenen Variablen
        const variablesObj: Record<string, any> = requiredVars.reduce(
          (acc, variable) => {
            if (win[variable] !== undefined) {
              acc[variable.replace("win_", "")] = win[variable];
            }
            return acc;
          },
          {}
        );

        resolve(variablesObj);
      })
      .catch((error) => {
        console.error("❌ Fehler beim Laden eines Skripts:", error);
        reject(error);
      });
  });
}
