# Import de périphériques depuis fichiers Markdown

Le module périphériques permet d'importer automatiquement des spécifications de périphériques depuis des fichiers Markdown (.md).

## Formats supportés

Le parser supporte deux formats de fichiers .md :

### Format simple

Le format minimal avec juste un titre et une description :

```markdown
# USB Device ID 0b05_17cb

## Description
Broadcom BCM20702A0 – Bluetooth USB (ASUS)
```

**Extraction automatique :**
- Nom du périphérique depuis la description
- Vendor ID et Product ID depuis le titre ou le nom de fichier
- Type de périphérique déduit de la description (souris, clavier, WiFi, etc.)
- Marque extraite de la description

### Format détaillé

Le format complet avec toutes les spécifications USB :

```markdown
# USB Device Specification — ID 0781:55ab

## Identification
- **Vendor ID**: 0x0781 (SanDisk Corp.)
- **Product ID**: 0x55ab
- **Commercial name**: SanDisk 3.2 Gen1 USB Flash Drive
- **Manufacturer string**: USB
- **Product string**: SanDisk 3.2Gen1
- **Serial number**: 040123d47e7a47e4ac9e89dd25318ac819d7be0fe18a9961190fdffe1052426fd4ae00000000000000000000a8e587bdff867418ab55810792a96c46

## USB Characteristics
- **USB version**: USB 3.2 Gen 1 (SuperSpeed)
- **Negotiated speed**: 5 Gb/s
- **bcdUSB**: 3.20
- **Max packet size (EP0)**: 9 bytes
- **Power mode**: Bus-powered
- **Max power draw**: 896 mA

## Device Class
- **Interface class**: 08 — Mass Storage
- **Subclass**: 06 — SCSI transparent command set
- **Protocol**: 80 — Bulk-Only Transport (BOT)

## Functional Role
- USB flash storage device
- Removable mass storage
- No HID or radio functionality

## Classification Summary
**Category**: USB Mass Storage Device
**Subcategory**: USB 3.x Flash Drive
**Criticality**: Low (non real-time device)
```

**Extraction complète :**
- Vendor ID et Product ID
- Nom commercial et modèle
- Marque (manufacturer)
- Numéro de série
- Version USB
- Vitesse de connexion
- Classe USB, sous-classe et protocole
- Catégorie fonctionnelle
- Notes sur le rôle, la performance, etc.

## Nommage des fichiers

Le parser peut extraire les IDs USB depuis le nom de fichier :

- `ID_0781_55ab.md` → Vendor: 0x0781, Product: 0x55ab
- `id_0b05_17cb.md` → Vendor: 0x0b05, Product: 0x17cb
- `ID_046d_c52b.md` → Vendor: 0x046d, Product: 0x c52b

## Détection automatique du type

Le parser détecte automatiquement le type de périphérique depuis la description :

| Mots-clés détectés | Type assigné |
|-------------------|--------------|
| souris, mouse | USB / Souris |
| clavier, keyboard | USB / Clavier |
| wifi, wireless | WiFi / Adaptateur WiFi |
| bluetooth | Bluetooth / Adaptateur Bluetooth |
| usb flash, clé usb, flash drive | USB / Clé USB |
| dongle | USB / Dongle |

## Extraction de la marque

Les marques courantes sont détectées automatiquement :
- Logitech
- SanDisk
- Ralink
- Broadcom
- ASUS
- Realtek
- TP-Link
- Intel
- Samsung
- Kingston
- Corsair

## Utilisation

### Via l'interface web

1. Accédez à [http://localhost:8087/peripherals.html](http://localhost:8087/peripherals.html)
2. Cliquez sur "Importer .md"
3. Sélectionnez votre fichier .md
4. Cliquez sur "Importer"
5. Le formulaire d'ajout s'ouvre avec les données pré-remplies
6. Vérifiez et complétez les informations
7. Enregistrez

### Via l'API

```bash
curl -X POST http://localhost:8007/api/peripherals/import/markdown \
  -F "file=@/path/to/ID_0781_55ab.md"
```

**Réponse :**

```json
{
  "success": true,
  "filename": "ID_0781_55ab.md",
  "parsed_data": {
    "nom": "SanDisk 3.2 Gen1 USB Flash Drive",
    "type_principal": "USB",
    "sous_type": "Clé USB",
    "marque": "SanDisk",
    "modele": "3.2Gen1",
    "numero_serie": "040123d47e7a...",
    "description": "SanDisk Corp. SanDisk 3.2Gen1",
    "caracteristiques_specifiques": {
      "vendor_id": "0x0781",
      "product_id": "0x55ab",
      "usb_version": "USB 3.2 Gen 1 (SuperSpeed)",
      "usb_speed": "5 Gb/s",
      "bcdUSB": "3.20",
      "max_power": "896 mA",
      "interface_class": "08",
      "interface_class_name": "Mass Storage",
      "category": "USB Mass Storage Device",
      "subcategory": "USB 3.x Flash Drive"
    }
  },
  "suggested_peripheral": {
    "nom": "SanDisk 3.2 Gen1 USB Flash Drive",
    "type_principal": "USB",
    "sous_type": "Clé USB",
    "marque": "SanDisk",
    "modele": "3.2Gen1",
    "numero_serie": "040123d47e7a...",
    "description": "SanDisk Corp. SanDisk 3.2Gen1",
    "caracteristiques_specifiques": { ... },
    "etat": "Neuf",
    "quantite_totale": 1,
    "quantite_disponible": 1
  }
}
```

## Sections reconnues

Le parser reconnaît les sections markdown suivantes :

- `## Description` - Description générale du périphérique
- `## Identification` - Vendor/Product ID, nom commercial, marque, modèle, S/N
- `## USB Characteristics` - Version USB, vitesse, alimentation
- `## Device Class` - Classe, sous-classe, protocole USB
- `## Functional Role` - Rôle fonctionnel (ajouté aux notes)
- `## Performance Notes` - Notes de performance
- `## Power & Stability Considerations` - Recommandations d'alimentation
- `## Recommended USB Port Placement` - Emplacement recommandé
- `## Typical Use Cases` - Cas d'usage typiques
- `## Operating System Support` - Support OS
- `## Classification Summary` - Catégorie et sous-catégorie

Les sections non listées ci-dessus sont ignorées.

## Caractéristiques spécifiques

Les informations USB techniques sont stockées dans le champ JSON `caracteristiques_specifiques` :

```json
{
  "vendor_id": "0x0781",
  "product_id": "0x55ab",
  "usb_version": "USB 3.2 Gen 1",
  "usb_speed": "5 Gb/s",
  "bcdUSB": "3.20",
  "max_power": "896 mA",
  "interface_class": "08",
  "interface_class_name": "Mass Storage",
  "interface_subclass": "06",
  "interface_subclass_name": "SCSI transparent command set",
  "interface_protocol": "80",
  "interface_protocol_name": "Bulk-Only Transport (BOT)",
  "category": "USB Mass Storage Device",
  "subcategory": "USB 3.x Flash Drive"
}
```

## Exemple de workflow complet

### 1. Créer un fichier de spécification

Créez `ID_046d_c52b.md` :

```markdown
# USB Device ID 046d_c52b

## Description
Logitech Unifying Receiver – Dongle clavier/souris
```

### 2. Importer via l'API

```bash
curl -X POST http://localhost:8007/api/peripherals/import/markdown \
  -F "file=@ID_046d_c52b.md"
```

### 3. Le backend analyse et retourne

```json
{
  "success": true,
  "filename": "ID_046d_c52b.md",
  "suggested_peripheral": {
    "nom": "Logitech Unifying Receiver – Dongle clavier/souris",
    "type_principal": "USB",
    "sous_type": "Dongle",
    "marque": "Logitech",
    "caracteristiques_specifiques": {
      "vendor_id": "0x046d",
      "product_id": "0xc52b"
    },
    "etat": "Neuf",
    "quantite_totale": 1,
    "quantite_disponible": 1
  }
}
```

### 4. Frontend pré-remplit le formulaire

L'utilisateur vérifie et complète :
- Prix d'achat
- Emplacement
- Photos
- Rating

### 5. Sauvegarde dans la base de données

Le périphérique est créé avec toutes les informations extraites.

## Gestion des erreurs

### Fichier non .md

```json
{
  "detail": "Only markdown (.md) files are supported"
}
```

### Encodage invalide

```json
{
  "detail": "File encoding error. Please ensure the file is UTF-8 encoded."
}
```

### Format invalide

```json
{
  "detail": "Failed to parse markdown file: ..."
}
```

## Fichiers d'exemple

Des fichiers d'exemple se trouvent dans le dossier `fichier_usb/` :

```bash
ls fichier_usb/
ID_0781_55ab.md      # Format détaillé
ID_0b05_17cb.md      # Format simple
ID_046d_c52b.md      # Logitech dongle
ID_148f_7601.md      # Adaptateur WiFi
...
```

## Code source

- **Parser backend** : [backend/app/utils/md_parser.py](../backend/app/utils/md_parser.py)
- **Endpoint API** : [backend/app/api/endpoints/peripherals.py](../backend/app/api/endpoints/peripherals.py)
- **Frontend modal** : [frontend/peripherals.html](../frontend/peripherals.html)
- **JavaScript handler** : [frontend/js/peripherals.js](../frontend/js/peripherals.js)

---

**Note :** Cette fonctionnalité complète l'import USB (`lsusb -v`) pour permettre l'import de spécifications pré-formatées en markdown.
