/* === Helpers communs aux pages d'accueil des jeux === */
/* Inclure via un include PHP dans un bloc script (voir mastermind/snake index.php).
   Expose window.AccueilJeu avec des helpers reutilisables.
   Chaque jeu garde sa logique metier inline mais utilise ces helpers. */

window.AccueilJeu = (function() {

  // Toggle d'une section (click + keydown Enter/Space) + scroll auto + fermeture des autres sections
  // options.onOuvert = callback appelé quand on ouvre la section (ex. charger parties publiques)
  function initToggleSection(carte, section, toutesLesSections, options) {
    options = options || {};
    var ouvrir = function() {
      section.classList.toggle('visible');
      toutesLesSections.forEach(function(s) {
        if (s !== section) s.classList.remove('visible');
      });
      if (section.classList.contains('visible')) {
        if (options.onOuvert) options.onOuvert();
        setTimeout(function() {
          section.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }, 100);
      }
    };
    carte.addEventListener('click', ouvrir);
    carte.addEventListener('keydown', function(e) {
      if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); ouvrir(); }
    });
  }

  // Toggle de visibilité (privée/publique) avec affichage conditionnel d'une zone
  // grilleId : id du conteneur des .visibilite-btn
  // zoneAfficherId : id de la zone à montrer si "publique" (peut être null)
  // onChange(valeur) : callback (peut être null)
  function initVisibiliteToggle(grilleId, zoneAfficherId, onChange) {
    var grille = document.getElementById(grilleId);
    if (!grille) return;
    grille.querySelectorAll('.visibilite-btn').forEach(function(btn) {
      btn.addEventListener('click', function() {
        grille.querySelectorAll('.visibilite-btn').forEach(function(b) { b.classList.remove('active'); });
        btn.classList.add('active');
        var valeur = btn.dataset.visibilite;
        if (zoneAfficherId) {
          var zone = document.getElementById(zoneAfficherId);
          if (zone) zone.style.display = valeur === 'publique' ? 'block' : 'none';
        }
        if (onChange) onChange(valeur);
      });
    });
  }

  // Grille de difficulté (radio-style) : clic active le bouton et appelle callback(data-difficulte)
  function initGrilleDifficulte(grilleId, onChange) {
    var grille = document.getElementById(grilleId);
    if (!grille) return;
    grille.querySelectorAll('.difficulte-btn').forEach(function(btn) {
      btn.addEventListener('click', function() {
        grille.querySelectorAll('.difficulte-btn').forEach(function(b) { b.classList.remove('active'); });
        btn.classList.add('active');
        if (onChange) onChange(btn.dataset.difficulte);
      });
    });
  }

  // Filtre les caractères autorisés dans un champ pseudo (lettres FR, chiffres, espace, _, -, max 30)
  function filtrerPseudo(el) {
    if (!el) return;
    el.addEventListener('input', function() {
      el.value = el.value.replace(/[^a-zA-Z0-9À-ɏ _-]/g, '').substring(0, 30);
    });
  }

  // Force uppercase + alphanumérique (pour codes de partie)
  function attacherValidationCode(el) {
    if (!el) return;
    el.addEventListener('input', function() {
      el.value = el.value.toUpperCase().replace(/[^A-Z0-9]/g, '');
    });
  }

  // Affiche un message d'erreur dans un élément, puis le vide après timeout
  function afficherErreur(el, msg, timeout) {
    if (!el) return;
    el.textContent = msg;
    setTimeout(function() { el.textContent = ''; }, timeout || 4000);
  }

  // Échappe le HTML pour éviter l'injection (à utiliser avec innerHTML)
  function echapperHtml(str) {
    var div = document.createElement('div');
    div.textContent = str == null ? '' : String(str);
    return div.innerHTML;
  }

  // Pré-remplit un ou plusieurs champs pseudo avec le pseudo connecté (et les désactive)
  function prefillPseudoConnecte(elements, pseudo) {
    if (!pseudo) return;
    var liste = Array.isArray(elements) ? elements : [elements];
    liste.forEach(function(el) {
      if (!el) return;
      el.value = pseudo;
      el.disabled = true;
      el.style.opacity = '0.7';
    });
  }

  // Soumet le bouton btn quand on appuie sur Entrée dans le champ input
  function attacherEnterKey(input, btn) {
    if (!input || !btn) return;
    input.addEventListener('keydown', function(e) {
      if (e.key === 'Enter') btn.click();
    });
  }

  // Polling : exécute fn() tant que section a la classe visible (toutes les intervalMs)
  function attacherPollingSection(section, fn, intervalMs) {
    setInterval(function() {
      if (section && section.classList.contains('visible')) fn();
    }, intervalMs || 5000);
  }

  return {
    initToggleSection: initToggleSection,
    initVisibiliteToggle: initVisibiliteToggle,
    initGrilleDifficulte: initGrilleDifficulte,
    filtrerPseudo: filtrerPseudo,
    attacherValidationCode: attacherValidationCode,
    afficherErreur: afficherErreur,
    echapperHtml: echapperHtml,
    prefillPseudoConnecte: prefillPseudoConnecte,
    attacherEnterKey: attacherEnterKey,
    attacherPollingSection: attacherPollingSection
  };
})();
