# ✅ Import .md avec détection de doublons - COMPLÉTÉ

## Modifications apportées

La fonctionnalité d'import de fichiers .md a été améliorée avec une **vérification automatique des doublons**.

### Backend modifié

**[backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py)**

Ajout de la vérification de doublon dans l'endpoint `/api/peripherals/import/markdown` :

```python
# Check for existing peripheral with same vendor_id and product_id
existing_peripheral = None
vendor_id = suggested.get("caracteristiques_specifiques", {}).get("vendor_id")
product_id = suggested.get("caracteristiques_specifiques", {}).get("product_id")

if vendor_id and product_id:
    # Search for peripheral with matching vendor_id and product_id
    all_peripherals = db.query(Peripheral).all()
    for periph in all_peripherals:
        if periph.caracteristiques_specifiques:
            p_vendor = periph.caracteristiques_specifiques.get("vendor_id")
            p_product = periph.caracteristiques_specifiques.get("product_id")
            if p_vendor == vendor_id and p_product == product_id:
                existing_peripheral = periph
                break
```

**Retour API :**
- Si **nouveau** : `already_exists: false` + `suggested_peripheral`
- Si **existe** : `already_exists: true` + `existing_peripheral`

### Frontend modifié

**[frontend/js/peripherals.js](frontend/js/peripherals.js)**

La fonction `importMarkdown()` gère maintenant deux cas :

#### Cas 1 : Périphérique nouveau
```javascript
if (result.already_exists) {
    // Doublon détecté...
} else if (result.suggested_peripheral) {
    // Nouveau périphérique
    closeModal('modal-import-md');
    showAddModal();

    // Pré-remplir tous les champs du formulaire
    if (suggested.nom) document.getElementById('nom').value = suggested.nom;
    if (suggested.type_principal) { ... }
    // etc.

    showSuccess(`Fichier ${result.filename} importé avec succès. Vérifiez et complétez les informations.`);
}
```

#### Cas 2 : Périphérique existant (doublon)
```javascript
if (result.already_exists) {
    closeModal('modal-import-md');

    const existing = result.existing_peripheral;
    const message = `Ce périphérique existe déjà dans la base de données:\n\n` +
        `Nom: ${existing.nom}\n` +
        `Marque: ${existing.marque || 'N/A'}\n` +
        `Modèle: ${existing.modele || 'N/A'}\n` +
        `Quantité: ${existing.quantite_totale}\n\n` +
        `Voulez-vous voir ce périphérique?`;

    if (confirm(message)) {
        // Redirige vers la page de détail
        window.location.href = `peripheral-detail.html?id=${existing.id}`;
    } else {
        showInfo(`Import annulé - le périphérique "${existing.nom}" existe déjà.`);
    }
}
```

### Documentation mise à jour

**[FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md)**

Ajout de deux workflows détaillés :
- Workflow Cas 1 : Périphérique nouveau (18 étapes)
- Workflow Cas 2 : Périphérique existant avec doublon (13 étapes)

## Fonctionnement

### Détection des doublons

La vérification se fait sur **vendor_id + product_id** :

1. Le fichier .md est parsé
2. On extrait `vendor_id` et `product_id` (depuis le contenu ou le nom de fichier)
3. On recherche dans la base tous les périphériques existants
4. On compare les `vendor_id` et `product_id` de chaque périphérique
5. Si match trouvé → **Doublon détecté**

**Exemple :**
```markdown
Fichier : ID_0781_55ab.md
→ vendor_id = 0x0781
→ product_id = 0x55ab

Recherche dans la base :
→ Périphérique #42 : vendor_id=0x0781, product_id=0x55ab
→ MATCH ! → Doublon détecté
```

### Expérience utilisateur

**Si nouveau périphérique :**
1. Modal import se ferme
2. Modal ajout s'ouvre
3. Formulaire pré-rempli avec toutes les données du fichier .md
4. L'utilisateur complète (prix, localisation, photos)
5. Enregistre → Périphérique créé

**Si périphérique existe déjà :**
1. Modal import se ferme
2. Dialog de confirmation s'affiche :
   ```
   Ce périphérique existe déjà dans la base de données:

   Nom: SanDisk USB Flash Drive
   Marque: SanDisk
   Modèle: 3.2Gen1
   Quantité: 2

   Voulez-vous voir ce périphérique?
   ```
3. Si **OUI** → Redirige vers la page de détail du périphérique existant
4. Si **NON** → Message "Import annulé - le périphérique existe déjà"

## Test rapide

```bash
# 1. Redémarrer le backend
docker compose restart backend

# 2. Importer un nouveau fichier (ex: ID_0b05_17cb.md)
# Via interface : http://localhost:8087/peripherals.html
# Bouton "Importer .md" → Sélectionner fichier → Importer
# Résultat : Formulaire pré-rempli

# 3. Réimporter le MÊME fichier
# Résultat : Message "Ce périphérique existe déjà..." avec option de voir

# 4. Test API direct
curl -X POST http://localhost:8007/api/peripherals/import/markdown \
  -F "file=@fichier_usb/ID_0b05_17cb.md" | jq

# Premier import : already_exists = false
# Second import : already_exists = true
```

## Avantages

✅ **Évite les doublons** - Impossible d'importer deux fois le même périphérique (vendor_id + product_id)
✅ **Navigation rapide** - Si doublon, option de voir directement le périphérique existant
✅ **Informé** - L'utilisateur sait immédiatement si le périphérique existe déjà
✅ **Transparence** - Affiche les infos du périphérique existant (nom, marque, modèle, quantité)
✅ **Workflow fluide** - Modal se ferme automatiquement, pas de confusion

## Fichiers modifiés

| Fichier | Modifications |
|---------|---------------|
| [backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py) | +40 lignes - Vérification doublon |
| [frontend/js/peripherals.js](frontend/js/peripherals.js) | +35 lignes - Gestion cas doublon |
| [FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md) | +50 lignes - Documentation workflows |

**Total :** ~125 lignes ajoutées

---

**Développé avec Claude Code** - 2025-12-30
