# Console Commands — CSI World

Toutes les commandes s'exécutent via :

```
& "C:\wamp64\bin\php\php8.2.29\php.exe" bin/console <commande> [options]
```

---

## `app:import-icons-csi-forever`

Importe (ou réimporte) toutes les icônes CSI Forever depuis `resources/CSI Forever/icons/` vers la table `icons_csi_forever`.

**Quand l'utiliser :** au premier déploiement, ou si les fichiers PNG sources ont été modifiés.

**Comportement :**
- Trie les fichiers `icon_N.png` par indice numérique
- Tronque la table avant réimport (`TRUNCATE`) — l'opération est destructive
- Affiche une barre de progression

```
php bin/console app:import-icons-csi-forever
```

**Exemple de sortie :**
```
Found 847 icons — truncating table and re-importing…
 847/847 [============================] 100%
 [OK] 847 icons imported into icons_csi_forever.
```

---

## `mmo:equipment:generate`

Génère aléatoirement une instance d'équipement (`EquipmentInstance`) à partir d'un modèle de base WeaponMmo ou ArmorMmo.

**Par défaut : dry-run** — rien n'est écrit en base. Utiliser `--persist` pour sauvegarder.

**Options :**

| Option | Court | Description |
|--------|-------|-------------|
| `--type` | `-t` | `weapon` ou `armor` (obligatoire) |
| `--base-id` | `-b` | ID du modèle de base WeaponMmo / ArmorMmo (obligatoire) |
| `--persist` | `-p` | Persiste l'instance en base (sans ce flag : dry-run) |

**Exemples :**

```bash
# Aperçu sans sauvegarde (arme de base #3)
php bin/console mmo:equipment:generate --type=weapon --base-id=3

# Générer et sauvegarder en base (armure de base #12)
php bin/console mmo:equipment:generate --type=armor --base-id=12 --persist
```

**Exemple de sortie (dry-run) :**
```
 Generated equipment instance
 ============================

  Name      Épée Furieuse +2
  Base type weapon
  Base ID   3
  Price     1 250 Dollawrs

 Affixes (2)
 -----------
  Fureur (prefix) — fragment : Furieuse
  +---------+--------------+
  | Effet   | Valeur roulée|
  +---------+--------------+
  | attaque | +12          |
  +---------+--------------+

 Stats snapshot
 --------------
  +----------+-------+
  | Stat     | Value |
  +----------+-------+
  | attaque  | 22    |
  | ...      | ...   |
  +----------+-------+

 ! [NOTE] Dry-run: nothing was written to the database. Use --persist to save.
```

---

## `mmo:recompute-snapshots`

Recalcule le `statsSnapshot` JSON de toutes les `EquipmentInstance` en base, puis synchronise les snapshots des annonces actives du marché (`MarketplaceListing`).

**Quand l'utiliser :**
- Après avoir modifié les stats ou propriétés d'un modèle de base (WeaponMmo / ArmorMmo)
- Après un correctif du calcul de snapshot (ex. : correction de l'accumulation des multiplicateurs)
- Après ajout de nouveaux champs dans `CaracteristicsTrait`

**Comportement :**
- Relit chaque instance depuis sa base (`baseType` + `baseId`) et ses affixes stockés
- Recalcule le snapshot complet : 8 stats de base + tous les champs `CaracteristicsTrait` non-null + effets accumulés des affixes
- Accumulation des multiplicateurs : `base + (valeur_affixe − 1.0)` — évite le doublement de l'identité
- Pour les annonces actives de type `weapon_instance` / `armor_instance` : met également à jour `statsSnapshot`, `description`, `specialEffect`, `formula`, `slot` dans `itemSnapshot`

```bash
php bin/console mmo:recompute-snapshots
```

**Exemple de sortie :**
```
 [OK] 22 instance(s) recalculée(s), 7 annonce(s) mise(s) à jour.
```

---

## `app:award-completion-badges`

Attribue rétroactivement les badges de complétion de jeu aux joueurs qui ont débloqué tous les achievements d'un jeu.

**Quand l'utiliser :** une seule fois après le déploiement en production, si des joueurs ont déjà complété un jeu avant l'introduction du système de badges.

**Comportement :**
- Parcourt tous les `gameId` distincts présents dans la table `achievement`
- Pour chaque jeu, cherche un badge avec le slug `game-complete-{gameId}`
- Attribue le badge à tout joueur ayant autant d'achievements débloqués que le total du jeu, s'il ne le possède pas déjà
- Flush par lots de 50 pour limiter la mémoire

```bash
php bin/console app:award-completion-badges
```

**Exemple de sortie :**
```
 Attribution rétroactive des badges de complétion
 =================================================

 Jeu #1 — 42 achievements, badge « CSI Forever — Complétion »
 ...

 [OK] 3 badge(s) attribué(s) sur 17 joueur(s) traité(s).
```

> **Note :** Si aucun badge `game-complete-{gameId}` n'existe en base pour un jeu donné, ce jeu est silencieusement ignoré.
