<?php

/**
 * Class Module_Import
 * 
 * Gère l'importation et l'enregistrement des modules JavaScript
 */
class Module_Import {

  /**
   * Instance unique de la classe (pattern Singleton)
   */
  private static $instance = null;

  /**
   * Liste des modules enregistrés
   */
  private $modules = [];

  /**
   * Constructeur privé (Singleton)
   */
  private function __construct() {
    add_filter('script_loader_tag', array($this, 'add_module_type'), 10, 3);
  }

  /**
   * Obtenir l'instance unique de la classe
   */
  public static function get_instance() {
    if (self::$instance === null) {
      self::$instance = new self();
    }
    return self::$instance;
  }

  /**
   * Enregistre un nouveau module
   * 
   * @param string $handle Identifiant unique du module
   * @param string $src URL du fichier module
   * @param array $deps Dépendances du module
   * @param string|bool|null $ver Version du module
   * @param bool $in_footer Charger dans le footer
   * @return bool True si l'enregistrement a réussi
   */
  public function register_module($handle, $src, $deps = array(), $ver = false, $in_footer = true) {
    if (empty($handle) || empty($src)) {
      return false;
    }

    $this->modules[] = $handle;

    return wp_register_script($handle, $src, $deps, $ver, $in_footer);
  }

  /**
   * Enregistre et charge un module
   * 
   * @param string $handle Identifiant unique du module
   * @param string $src URL du fichier module
   * @param array $deps Dépendances du module
   * @param string|bool|null $ver Version du module
   * @param bool $in_footer Charger dans le footer
   * @return bool True si l'enregistrement et le chargement ont réussi
   */
  public function enqueue_module($handle, $src, $deps = array(), $ver = false, $in_footer = true) {
    if ($this->register_module($handle, $src, $deps, $ver, $in_footer)) {
      wp_enqueue_script($handle);
      return true;
    }
    return false;
  }

  /**
   * Ajoute l'attribut type="module" aux scripts enregistrés comme modules
   * 
   * @param string $tag Tag script HTML
   * @param string $handle Identifiant du script
   * @param string $src URL du script
   * @return string Tag script modifié
   */
  public function add_module_type($tag, $handle, $src) {
    if (in_array($handle, $this->modules)) {
      return '<script type="module" src="' . esc_url($src) . '"></script>';
    }
    return $tag;
  }
}

// Fonction helper pour obtenir l'instance du gestionnaire de modules
function orphic_module_import() {
  return Module_Import::get_instance();
}
