# Moodia MBZ Export

Module d'export des cours Moodia au format MBZ (Moodle Backup).

## Structure

```
Export/
├── MbzExporter.php                    # Point d'entrée unique (façade)
│
├── Builder/                           # Construction de l'archive
│   ├── ArchiveBuilder.php             # Création du fichier tar.gz
│   └── XmlBuilder.php                 # Utilitaires XML (encoding, NULL, etc.)
│
├── Generator/                         # Génération des fichiers XML
│   │
│   ├── Structure/                     # Structure MBZ obligatoire
│   │   ├── BackupGenerator.php        # moodle_backup.xml
│   │   ├── CourseGenerator.php        # course/course.xml
│   │   ├── SectionGenerator.php       # sections/section_X/section.xml
│   │   ├── FilesGenerator.php         # files.xml
│   │   └── QuestionsGenerator.php     # questions.xml
│   │
│   ├── Activity/                      # Activités Moodle
│   │   ├── Contract/
│   │   │   └── ActivityGeneratorInterface.php
│   │   ├── Common/
│   │   │   ├── AbstractActivityGenerator.php
│   │   │   └── ModuleXmlGenerator.php
│   │   ├── Page/
│   │   │   └── PageGenerator.php      # mod_page
│   │   ├── Quiz/
│   │   │   └── QuizGenerator.php      # mod_quiz
│   │   └── Resource/
│   │       └── ResourceGenerator.php  # mod_resource (audio, fichiers)
│   │
│   └── Structure/
│       └── QuestionsGenerator.php     # délègue l'écriture XML au registre de types
│
├── Handler/                           # Gestionnaires métier
│   ├── File/
│   │   ├── FileHandler.php            # Gestion fichiers pour MBZ
│   │   └── FileHasher.php             # Calcul SHA1 (contenthash)
│   └── Audio/
│       └── AudioExportHandler.php     # Génération/export audio
│
├── Model/                             # DTOs (Data Transfer Objects)
│   ├── Backup/
│   │   └── BackupInfo.php
│   ├── Course/
│   │   ├── Course.php
│   │   └── Section.php
│   ├── Activity/
│   │   └── Activity.php
│   ├── Question/
│   │   ├── Question.php
│   │   └── Answer.php
│   └── File/
│       └── ExportFile.php
│
├── Transformer/                       # Conversion Moodia → MBZ
│   └── MoodiaTransformer.php          # Transforme les données cours
│
├── Registry/                          # Auto-découverte des générateurs
│   └── ActivityRegistry.php
│
├── Exception/                         # Exceptions spécifiques
│   └── ExportException.php
│
└── Config/
    └── MoodleDefaults.php             # Valeurs par défaut Moodle
```

## Utilisation

```php
// Dans un contrôleur
$mbzPath = $this->mbzExporter->export($moodiaCourse);
return $this->file($mbzPath, 'cours.mbz');
```

## Ajouter une nouvelle activité

1. Créer un dossier `Generator/Activity/NouveauType/`
2. Créer `NouveauTypeGenerator.php` implémentant `ActivityGeneratorInterface`
3. Le générateur sera auto-découvert via `ActivityRegistry`

## Ajouter un nouveau type de question

Les types de questions de quiz vivent **hors** de ce dossier `Export/`, dans
`src/Service/Moodia/Quiz/QuestionType/` (ils servent autant à la persistance/validation
qu'à l'export). **Ajouter un type = une seule classe :**

1. Créer `src/Service/Moodia/Quiz/QuestionType/NouveauType.php` implémentant
   `QuestionTypeInterface` :
   - `key()` / `label()` : identifiant interne + libellé éditeur ;
   - `moodleQtype()` : le `qtype` Moodle cible (`multichoice`, `truefalse`, `shortanswer`, `numerical`, `match`, `gapselect`, `ddwtos`, `calculated`…) ;
   - `defaults()` : la structure JSON d'une question vierge ;
   - `validate(array $question): array` : liste d'erreurs (vide = valide) ;
   - `writeMoodleXml(\DOMElement $questionEl, Question $question, XmlBuilder $xml)` : l'écriture du plugin XML.
2. Le taguer dans `config/services.yaml` avec `tags: ['moodia.question_type']` —
   `QuestionTypeRegistry` (constructeur `!tagged_iterator moodia.question_type`) l'auto-découvre.
3. (Front) ajouter une entrée `{key, label}` à `QUIZ_QUESTION_TYPES` dans
   `assets/controllers/moodia/editor_controller.js` ; les rendus QCM / réponses ouvertes
   couvrent déjà la plupart des cas.

Référence : `QuestionsGenerator` (export) et `CourseTransformer`/`MoodiaPersistenceService`
(persistance) délèguent tous au registre — aucun `switch` par type à maintenir ailleurs.

## Format MBZ

Le format MBZ est une archive **tar.gz** contenant :
- `moodle_backup.xml` : Descripteur principal
- `course/course.xml` : Paramètres du cours
- `sections/section_X/section.xml` : Sections avec séquence des activités
- `activities/TYPE_ID/` : Dossier par activité
- `questions.xml` : Banque de questions
- `files.xml` : Références aux fichiers
- `files/XX/HASH` : Fichiers physiques (audio, etc.)
