import { parseString } from 'xml2js';
import { renderMeasurementResults } from './renderers/MeasurementRenderer.js';
import { renderAdminData } from './renderers/AdminRenderer.js';


import { EventEmitter } from 'events';
if (typeof window.EventEmitter !== 'function') {
  window.EventEmitter = EventEmitter;
}

export function init(xmlStr, options = {}) {
  const containerId = options.containerId || 'app';
  const appContainer = document.getElementById(containerId);
  if (!appContainer) {
    console.error('No container found with id', containerId);
    return;
  }
  appContainer.innerHTML = '';

  // Parse the XML string first
  parseString(xmlStr, { explicitArray: false }, (err, result) => {
    if (err) {
      console.error('Error parsing XML:', err);
      return;
    }
    const dccData = result;
    const cert = dccData['dcc:digitalCalibrationCertificate'];
    if (!cert) {
      console.error("No dcc:digitalCalibrationCertificate found in XML");
      return;
    }

    // Extract available languages from the administrative data coreData section
    let languages = [];
    if (cert['dcc:administrativeData'] && cert['dcc:administrativeData']['dcc:coreData']) {
      const coreData = cert['dcc:administrativeData']['dcc:coreData'];
      let langs = coreData['dcc:usedLangCodeISO639_1'];
      if (langs) {
        if (!Array.isArray(langs)) { langs = [langs]; }
        languages = langs;
      }
    }

    // Use provided default language if available and present, else use the first available or fallback to 'en'
    let selectedLanguage = (options.language && languages.includes(options.language))
        ? options.language
        : (languages.length ? languages[0] : 'en');

    // Build a dynamic language dropdown based on the extracted languages
    const langSelect = document.createElement('select');
    languages.forEach(lang => {
      const option = document.createElement('option');
      option.value = lang;
      option.textContent = lang;
      if (lang === selectedLanguage) option.selected = true;
      langSelect.appendChild(option);
    });
    // When the language is changed, reinitialize the app with the same XML but new language.
    langSelect.addEventListener('change', (e) => {
      init(xmlStr, { containerId, language: e.target.value });
    });
    appContainer.appendChild(langSelect);

    // Create containers for admin data and measurement results
    const adminContainer = document.createElement('div');
    adminContainer.id = 'adminData';
    appContainer.appendChild(adminContainer);

    const measContainer = document.createElement('div');
    measContainer.id = 'measurementResults';
    appContainer.appendChild(measContainer);

    // Render admin and measurement data if available
    if (cert['dcc:administrativeData']) {
      renderAdminData(cert['dcc:administrativeData'], selectedLanguage);
    }
    if (cert['dcc:measurementResults']) {
      renderMeasurementResults(cert['dcc:measurementResults'], selectedLanguage);
    }
  });
}