// EN: Main JavaScript entry point for the 3D printing module UI logic.
//     - Handles initialization, language selection, file input, and triggers calculation and 3D preview.
// DE: Haupt-JavaScript-Einstiegspunkt für die UI-Logik des 3D-Druck-Moduls.
//     - Steuert Initialisierung, Sprachauswahl, Dateieingabe und löst Berechnung sowie 3D-Vorschau aus.

import { getDomElements } from './config.js';
import { setLanguage, initializeCustomFileInput, initializeMaterialPopup } from './ui.js';
import { loadInitialResources, triggerCalculation } from './api.js';

/**
 * EN: Initializes all logic for a single 3D printer module.
 * DE: Initialisiert die gesamte Logik für ein einzelnes 3D-Drucker-Modul.
 * @param {HTMLElement} rootElement - EN: The container element of the module. / DE: Das Containerelement des Moduls.
 */
function initializeModule(rootElement) {
  const dom = getDomElements(rootElement);

  const api = {
    loadInitialResources: () => loadInitialResources(dom),
    triggerCalculation: () => triggerCalculation(dom)
  };

  const ui = {
    setLanguage: (lang) => setLanguage(lang, dom),
    initializeCustomFileInput: () => initializeCustomFileInput(dom),
    initializeMaterialPopup: () => initializeMaterialPopup(dom)
  };

  // EN: Set language based on user preference or browser
  // DE: Spracheinstellung basierend auf Benutzervorliebe oder Browser
  const preferredLanguage = localStorage.getItem('preferredLanguage') || navigator.language.split('-')[0];
  const initialLang = ['en', 'de'].includes(preferredLanguage) ? preferredLanguage : 'de';
  dom.languageSelect.value = initialLang;
  ui.setLanguage(initialLang);

  // EN: Initialize file input and material popup
  // DE: Dateieingabe und Materialauswahl initialisieren
  ui.initializeCustomFileInput();
  ui.initializeMaterialPopup();

  // EN: Load initial resources (printers, materials, qualities)
  // DE: Initialressourcen laden (Drucker, Materialien, Qualitäten)
  api.loadInitialResources();

  // EN: Event listeners for UI interactions and calculation triggers
  // DE: Event-Listener für UI-Interaktionen und Berechnungsauslösung
  dom.printerSelect.addEventListener('change', api.triggerCalculation);
  dom.qualitySelect.addEventListener('change', api.triggerCalculation);
  dom.fileInput.addEventListener('change', () => {
    api.triggerCalculation();
    const stlFile = dom.fileInput.files[0];
    if (stlFile && stlFile.name.toLowerCase().endsWith('.stl')) {
      if (window.showSTLModel) {
        window.showSTLModel(stlFile);
      }
    }
  });
  // El botón de imprimir solo debe generar el recibo, no recalcular ni recargar el modelo
  // La lógica de generación del recibo está en script.js (downloadTicket)

  dom.languageSelect.addEventListener('change', (e) => ui.setLanguage(e.target.value));
}

window.addEventListener('DOMContentLoaded', () => {
  const moduleElement = document.querySelector('.modulo-impresion3d');

  if (moduleElement) {
    initializeModule(moduleElement);
  }
});