'use strict';
/*
 * Контент-движок, Фаза 1 — data-driven регистрация ВСЕХ симуляций в LabRegistry.
 *
 * Вместо ручного переписывания 40 манифестов модуль строит их из единых источников:
 *   - метаданные (id/cat/title/desc) и preview — из массива SIMS (lab-glue.js);
 *   - теория — из объекта THEORY (lab-init.js);
 *   - поведение open(ctx) — из карты OPEN ниже (обёртки над глобальными _openXxx).
 * Это структурно гарантирует паритет с прежним каталогом и диспетчеризацией.
 *
 * Подключается ПОСЛЕДНИМ среди labs-скриптов (defer), поэтому SIMS, THEORY и все
 * _openXxx уже определены. Останов/закрытие симуляций по-прежнему выполняет
 * «дробовик» _pauseAllSims()/closeSim() (точный паритет) — поэтому stop/destroy
 * в манифестах не задаются на этом этапе.
 *
 * После регистрации if-цепочка в openSim() становится мёртвой и удалена.
 *
 * В Фазе 1 заменил пилотный _pilots.js. SIMS/THEORY остаются источниками данных
 * (SIMS → БД в Фазе 4, THEORY сворачивается в манифесты позже).
 */
(function () {
  if (!window.LabRegistry) return;
  if (typeof SIMS === 'undefined') return;
  var R = window.LabRegistry;
  var T = (typeof THEORY !== 'undefined') ? THEORY : {};

  // id -> open(ctx). ctx.arg — параметр deep-link (после двоеточия): stereo:cube и т.п.
  var OPEN = {
    graph:          function (c) { _openGraph(); },
    projectile:     function (c) { _openProjectile(); },
    collision:      function (c) { _openCollision(); },
    triangle:       function (c) { _openTriangle(); },
    trigcircle:     function (c) { _openTrigCircle(); },
    emfield:        function (c) { _openEMField(c.arg || 'E'); },
    molphys:        function (c) { _openMolPhys(c.arg); },
    circuit:        function (c) { _openCircuit(); },
    chemistry:      function (c) { _openChemistry(c.arg); },
    dynamics:       function (c) { _openDynamics(c.arg); },
    crystal:        function (c) { _openCrystal(); },
    orbitals:       function (c) { _openOrbitals(); },
    stereo:         function (c) { _openStereo(c.arg); },
    chemsandbox:    function (c) { _openChemSandbox(); },
    celldivision:   function (c) { _openCellDivision(); },
    photosynthesis: function (c) { _openPhotosynthesis(); },
    angrybirds:     function (c) { _openAngryBirds(); },
    quadratic:      function (c) { _openQuadratic(); },
    normaldist:     function (c) { _openNormalDist(); },
    graphtransform: function (c) { _openGraphTransform(); },
    pendulum:       function (c) { _openPendulum(); },
    equilibrium:    function (c) { _openEquilibrium(); },
    opticsbench:    function (c) { _openOpticsBench(c.arg || 'lens'); },
    isoprocess:     function (c) { _openIsoprocess(); },
    titration:      function (c) { _openTitration(); },
    probability:    function (c) { _openProbability(); },
    bohratom:       function (c) { _openBohrAtom(); },
    electrolysis:   function (c) { _openElectrolysis(); },
    race:           function (c) { _openRace(); },
    waves:          function (c) { _openWaves(); },
    hydrostatics:   function (c) { _openHydro(c.arg); },
    radioactive:    function (c) { _openRadioactive(); },
    geometry:       function (c) { _openGeometry(); },
    logic:          function (c) { _openLogic(); },
    heatengine:     function (c) { _openHeatEngine(); },
    stoichiometry:  function (c) { _openStoich(); },
    qualanalysis:   function (c) { _openQualAnalysis(); },
    periodic:       function (c) { _openPeriodic(); },
    organic:        function (c) { _openOrganic(); },
    solutions:      function (c) { _openSolutions(); }
  };

  SIMS.forEach(function (s) {
    if (!s.id) return;            // "Скоро" — карточка без id
    var open = OPEN[s.id];
    if (!open) {                  // подстраховка: незамапленный id оставляем legacy-пути
      if (window.console) console.warn('[LabRegistry] нет open() для', s.id);
      return;
    }
    R.register({
      id: s.id,
      cat: s.cat,
      title: s.title,
      desc: s.desc,
      preview: s.preview,         // уже готовая SVG-строка (P_* вычислены в SIMS)
      theory: T[s.id] || null,
      // Фаза 3: ленивая загрузка кода. LabLoader.ensure(id) подгружает файлы
      // симуляции (+ three.js при необходимости), затем выполняется raw-open.
      // Если LabLoader недоступен — открываем синхронно как раньше (фолбэк).
      open: (function (rawOpen, simId) {
        return function (c) {
          if (window.LabLoader && window.LabLoader.ensure) {
            return window.LabLoader.ensure(simId).then(function () { rawOpen(c); });
          }
          rawOpen(c);
        };
      })(open, s.id)
      // stop/destroy: глобальный «дробовик» _pauseAllSims()/closeSim() — паритет
    });
  });

  // Алиасы deep-link → канонический id[:arg]. Диспетчер openSim() нормализует их
  // перед обращением к реестру (карточек у алиасов нет — только прямые ссылки).
  window.LAB_SIM_ALIASES = {
    magnetic:   'emfield:B',
    coulomb:    'emfield:E',
    thinlens:   'opticsbench:lens',
    mirrors:    'opticsbench:mirror',
    refraction: 'opticsbench:refraction'
  };
})();
