# Feature: Import USB avec informations structurées

## Vue d'ensemble

Import de périphériques USB à partir d'informations structurées (format texte avec champs identifiés).
Contrairement à l'import `lsusb -v` qui nécessite la sortie brute de la commande, cet import accepte des informations formatées provenant d'outils GUI ou de sorties pré-traitées.

## Format d'entrée supporté

### Format texte structuré (français)

```
Bus : 003
Device : 040
Vendor ID : 0x2b89
Product ID : 0x8761
Vendor string : Realtek
Product string : Bluetooth Radio
Numéro de série : 00E04C239987
Vitesse négociée : Full Speed (12 Mbps)
Version USB déclarée : USB 1.10 (bcdUSB 1.10)
Classe périphérique : 224 → Wireless
Sous-classe périphérique : 1 → Radio Frequency
Protocole périphérique : 1 → Bluetooth
Puissance maximale déclarée : 500 mA
Mode d'alimentation : Self Powered
Interface 0
Classe interface : 224 → Wireless
...
```

## Avantages par rapport à lsusb -v

| Aspect | lsusb -v | Info structurée |
|--------|----------|-----------------|
| **Format** | Sortie brute complète | Informations sélectionnées |
| **Source** | Commande CLI uniquement | CLI, GUI, outils tiers |
| **Taille** | Très volumineuse | Plus compacte |
| **Lisibilité** | Difficile (sortie brute) | Facile (formaté) |
| **Stockage CLI** | Markdown brut | **YAML structuré** |

## Workflow utilisateur

1. **Obtenir les informations USB** depuis :
   - Un outil GUI (gestionnaire de périphériques)
   - Une sortie formatée d'un script
   - Un export d'un autre système

2. **Cliquer sur "Importer USB (Info)"**

3. **Coller les informations** dans la zone de texte

4. **Cliquer "Importer"**

5. **Le système :**
   - ✅ Parse les informations
   - ✅ Extrait les champs généraux (nom, marque, numero_serie)
   - ✅ **Détecte automatiquement type_principal et sous_type**
   - ✅ Formate TOUTES les infos en **YAML structuré** pour le champ `cli`
   - ✅ Vérifie si le périphérique existe déjà
   - ✅ Pré-remplit le formulaire

6. **Utilisateur complète et enregistre**

## Extraction des champs

### Champs généraux (formulaire)

Extraits automatiquement :
- **`nom`** ← `Product string` ou `iProduct`
- **`marque`** ← `Vendor string` ou `iManufacturer`
- **`numero_serie`** ← `Numéro de série` (si présent)

### Caractéristiques spécifiques (JSON)

Pour recherche et filtrage :
```json
{
  "vendor_id": "0x2b89",
  "product_id": "0x8761",
  "usb_version": "USB 1.10",
  "vitesse_negociee": "Full Speed (12 Mbps)",
  "device_class": "224",
  "device_class_nom": "Wireless",
  "device_subclass": "1",
  "device_subclass_nom": "Radio Frequency",
  "device_protocol": "1",
  "device_protocol_nom": "Bluetooth",
  "max_power": "500 mA",
  "power_mode": "Self Powered"
}
```

### Section CLI (YAML structuré)

**TOUTES** les informations en format YAML pour une vue complète :

```yaml
# Informations USB extraites

bus: '003'
device: '040'

identification:
  vendor_id: '0x2b89'
  product_id: '0x8761'
  vendor_string: Realtek
  product_string: Bluetooth Radio
  numero_serie: 00E04C239987

usb:
  version: USB 1.10
  vitesse_negociee: Full Speed (12 Mbps)

classe:
  device_class: '224'
  device_class_nom: Wireless
  device_subclass: '1'
  device_subclass_nom: Radio Frequency
  device_protocol: '1'
  device_protocol_nom: Bluetooth

alimentation:
  max_power: 500 mA
  power_mode: Self Powered

interfaces:
  - numero: 0
    classe:
      code: '224'
      nom: Wireless
    sous_classe:
      code: '1'
      nom: Radio Frequency
    protocole:
      code: '1'
      nom: Bluetooth
    nombre_endpoints: 3

endpoints:
  - adresse: '0x81'
    direction: IN
    type_transfert: Interrupt
    taille_max_paquet: 16
    intervalle: 1
  - adresse: '0x02'
    direction: OUT
    type_transfert: Bulk
    taille_max_paquet: 64
```

## Détection automatique du type

Le système utilise le même classificateur intelligent que l'import lsusb :

**Exemple 1 : Bluetooth**
```
Classe périphérique : 224 → Wireless
Protocole périphérique : 1 → Bluetooth
```
→ **Détecté : `type_principal = "Bluetooth"`, `sous_type = "Autre"`**

**Exemple 2 : Clé USB**
```
Classe périphérique : 0 [unknown]
Classe interface : 8 → Mass Storage
Product string : SanDisk 3.2Gen1
```
→ **Détecté : `type_principal = "Stockage"`, `sous_type = "Clé USB"`**

**Exemple 3 : Disque dur externe**
```
Classe interface : 8 → Mass Storage
Product string : My Passport 25A2
```
→ **Détecté : `type_principal = "Stockage"`, `sous_type = "Disque dur externe"`**

## API Endpoint

### POST /api/peripherals/import/usb-structured

**Request:**
```
POST /api/peripherals/import/usb-structured
Content-Type: multipart/form-data

usb_info: <texte formaté>
```

**Response (nouveau périphérique):**
```json
{
  "success": true,
  "already_exists": false,
  "suggested_peripheral": {
    "nom": "Bluetooth Radio",
    "marque": "Realtek",
    "numero_serie": "00E04C239987",
    "type_principal": "Bluetooth",
    "sous_type": "Autre",
    "cli": "# Informations USB\n\n## Données structurées (YAML)\n\n```yaml\n...\n```\n\n## Sortie brute\n\n```\n...\n```",
    "caracteristiques_specifiques": {
      "vendor_id": "0x2b89",
      "product_id": "0x8761",
      ...
    }
  },
  "parsed_data": {
    "bus": "003",
    "device": "040",
    ...
  }
}
```

**Response (périphérique existant):**
```json
{
  "success": true,
  "already_exists": true,
  "existing_peripheral_id": 42,
  "existing_peripheral": {
    "id": 42,
    "nom": "Bluetooth Radio",
    "marque": "Realtek",
    ...
  }
}
```

## Fichiers modifiés

### Backend

#### 1. Parser USB structuré - `backend/app/utils/usb_info_parser.py` (NOUVEAU)

Fonctions principales :
- `parse_structured_usb_info()` - Parse le texte structuré
- `extract_interfaces()` - Extrait les interfaces
- `extract_endpoints()` - Extrait les endpoints
- `format_cli_as_yaml()` - Formate en YAML
- `create_full_cli_section()` - Crée la section CLI complète (YAML + raw)

#### 2. API Endpoint - `backend/app/api/endpoints/peripherals.py`

**Ligne 29** - Import du parser :
```python
from app.utils.usb_info_parser import parse_structured_usb_info, create_full_cli_section
```

**Ligne 865-972** - Nouvel endpoint `/import/usb-structured` :
- Parse les informations structurées
- Classification intelligente du type
- Détection des doublons
- Retour des données suggérées avec CLI en YAML

### Frontend

#### 1. HTML - `frontend/peripherals.html`

**Ligne 67-69** - Nouveau bouton dans la toolbar :
```html
<button class="btn btn-secondary" onclick="showImportUSBStructuredModal()">
    <i class="fas fa-info-circle"></i> Importer USB (Info)
</button>
```

**Ligne 342-376** - Nouveau modal `modal-import-usb-structured` :
- Instructions
- Zone de texte grande (20 lignes)
- Placeholder avec exemple
- Boutons Annuler/Importer

#### 2. JavaScript - `frontend/js/peripherals.js`

**Ligne 310-314** - Fonction d'affichage du modal :
```javascript
function showImportUSBStructuredModal() {
    document.getElementById('form-import-usb-structured').reset();
    document.getElementById('modal-import-usb-structured').style.display = 'block';
}
```

**Ligne 501-583** - Fonction d'import :
```javascript
async function importUSBStructured(event) {
    // 1. Appel API
    // 2. Gestion doublon
    // 3. Pré-remplissage formulaire
    // 4. Pré-sélection type_principal et sous_type
}
```

## Exemples d'utilisation

### Exemple 1 : Import Bluetooth Realtek

**Input :**
```
Bus : 003
Device : 040
Vendor ID : 0x2b89
Product ID : 0x8761
Vendor string : Realtek
Product string : Bluetooth Radio
Numéro de série : 00E04C239987
Vitesse négociée : Full Speed (12 Mbps)
Version USB déclarée : USB 1.10 (bcdUSB 1.10)
Classe périphérique : 224 → Wireless
Sous-classe périphérique : 1 → Radio Frequency
Protocole périphérique : 1 → Bluetooth
Puissance maximale déclarée : 500 mA
Mode d'alimentation : Self Powered
```

**Résultat :**
- `nom` = "Bluetooth Radio"
- `marque` = "Realtek"
- `type_principal` = "Bluetooth" (détecté)
- `sous_type` = "Autre" (détecté)
- `cli` = YAML structuré + sortie brute

### Exemple 2 : Import Clé USB SanDisk

**Input :**
```
Bus : 004
Device : 005
Vendor ID : 0x0781
Product ID : 0x55ab
Vendor string : SanDisk Corp.
Product string : SanDisk 3.2Gen1
Vitesse négociée : SuperSpeed (5 Gbps)
Version USB déclarée : USB 3.20 (bcdUSB 3.20)
Classe périphérique : 0 [unknown]
Puissance maximale déclarée : 896 mA
Mode d'alimentation : Bus Powered
Interface 0
Classe interface : 8 → Mass Storage
Sous-classe interface : 6 → SCSI
Protocole interface : 80 → Bulk-Only
```

**Résultat :**
- `nom` = "SanDisk 3.2Gen1"
- `marque` = "SanDisk Corp."
- `type_principal` = "Stockage" (détecté via classe 8)
- `sous_type` = "Clé USB" (détecté via mots-clés)
- `cli` = YAML avec interfaces et endpoints

## Comparaison des 3 méthodes d'import

| Méthode | Source | Complexité | Format CLI | Cas d'usage |
|---------|--------|------------|------------|-------------|
| **lsusb -v** | Commande CLI | 2 étapes (sélection) | Markdown brut | Système Linux avec accès terminal |
| **Info structurée** | Texte formaté | 1 étape (direct) | **YAML + brut** | Outils GUI, exports, documentation |
| **Markdown (.md)** | Fichier | 1 étape (upload) | Stocké dans `synthese` | Spécifications existantes |

## Avantages de cette approche

✅ **Format YAML exploitable** - Facile à parser, requêter, afficher
✅ **Vue complète** - YAML structuré + sortie brute préservée
✅ **Détection automatique** - Type et sous-type détectés intelligemment
✅ **Flexible** - Accepte différentes sources d'information
✅ **Organisé** - Informations groupées logiquement (identification, USB, classe, alimentation, interfaces, endpoints)
✅ **Extensible** - Facile d'ajouter de nouveaux champs parsés

## Limitations

⚠️ **Format français uniquement** - Les patterns regex sont en français
⚠️ **Champs optionnels** - Si un champ manque, il n'apparaîtra pas dans le YAML
⚠️ **Numéro de série** - Peut être très long (hash pour certains périphériques)

## Améliorations futures

1. **Support multilingue** - Patterns en anglais + français
2. **Validation** - Vérifier la cohérence des données
3. **Templates** - Proposer des templates pour différents outils
4. **Export** - Générer le format structuré depuis une fiche existante
5. **Comparaison** - Comparer deux CLI YAML (avant/après)
