# Outils et Technologies

Ce document liste les technologies utilisées dans le projet suivi_produit.

---

## Backend

| Outil | Version | Description |
|-------|---------|-------------|
| **Python** | 3.11+ | Langage principal du backend |
| **FastAPI** | ^0.109 | Framework web asynchrone, génération automatique OpenAPI |
| **Uvicorn** | ^0.24 | Serveur ASGI haute performance pour FastAPI |
| **Pydantic** | ^2.5 | Validation des données et sérialisation JSON |
| **APScheduler** | ^3.11 | Planificateur de tâches pour le scraping périodique |
| **Loguru** | ^0.7 | Logging simplifié avec rotation automatique |
| **python-dotenv** | ^1.0 | Chargement des variables d'environnement depuis `.env` |

### Gestion des dépendances
| Outil | Description |
|-------|-------------|
| **Poetry** | Gestionnaire de dépendances et environnements virtuels Python |

---

## Scraping

| Outil | Version | Description |
|-------|---------|-------------|
| **Playwright** | ^1.40 | Automatisation navigateur (Chromium) pour le scraping |
| **BeautifulSoup4** | ^4.12 | Parsing HTML pour extraction des données |

### Configuration Playwright
- **Navigateur** : Chromium (headless par défaut)
- **Locale** : `fr-FR`
- **Timezone** : `Europe/Paris`
- **Viewport** : 1366x768
- **Délais aléatoires** : 1-3s entre les requêtes (anti-détection)

---

## Base de Données

| Outil | Description |
|-------|-------------|
| **SQLite** | Base de données relationnelle légère, fichier unique |
| **SQLAlchemy** | ORM Python pour la gestion des modèles et requêtes |

### Structure des tables
- `products` : informations produits (URL, ASIN, titre, catégorie)
- `product_snapshots` : historique des prix et états (prix, stock, note, badges)
- `scrape_runs` : métadonnées des exécutions de scraping

### Stockage fichiers
- **Raw JSON** : sauvegarde brute des scrapes dans `backend/data/raw/`
- **Screenshots** : captures debug dans `backend/data/screenshots/`

---

## Frontend

| Outil | Version | Description |
|-------|---------|-------------|
| **React** | ^18.3 | Bibliothèque UI composants |
| **Vite** | ^5.1 | Bundler et serveur de développement rapide |
| **Zustand** | ^4.4 | Gestion d'état globale légère |
| **React Router** | ^6.22 | Routage SPA |
| **SCSS/Sass** | ^1.77 | Préprocesseur CSS |

### Graphiques
| Outil | Version | Description |
|-------|---------|-------------|
| **Chart.js** | ^4.5 | Bibliothèque de graphiques |
| **react-chartjs-2** | ^5.3 | Wrapper React pour Chart.js |
| **chartjs-plugin-annotation** | ^3.1 | Plugin pour lignes de référence |

### Icônes
| Outil | Version | Description |
|-------|---------|-------------|
| **Font Awesome** | ^6.5 | Bibliothèque d'icônes (Free) |

---

## Thème UI

### Palette Gruvbox Dark
Le thème utilise la palette **Gruvbox** en mode sombre :

| Couleur | Hex | Usage |
|---------|-----|-------|
| Background | `#282828` | Fond principal |
| Background Alt | `#3c3836` | Cartes, modales |
| Background Light | `#504945` | Hover, bordures |
| Foreground | `#ebdbb2` | Texte principal |
| Foreground Dim | `#a89984` | Texte secondaire |
| Orange | `#fe8019` | Accent principal, liens |
| Yellow | `#fabd2f` | Warnings, tendance stable |
| Green | `#b8bb26` | Succès, baisse de prix |
| Red | `#fb4934` | Erreurs, hausse de prix |
| Blue | `#83a598` | Info, badges |
| Purple | `#d3869b` | Badges spéciaux |
| Aqua | `#8ec07c` | Stock disponible |

### Style
- **Arrondis** : `border-radius: 8px` (cartes), `4px` (boutons)
- **Ombres** : `box-shadow: 0 4px 6px rgba(0,0,0,0.3)`
- **Police** : System fonts stack (sans-serif)
- **Responsive** : Grille configurable (1-4 colonnes)

---

## Tests

| Outil | Version | Description |
|-------|---------|-------------|
| **Pytest** | ^8.4 | Framework de tests Python |
| **Coverage** | - | Mesure de couverture de code |

### Commandes
```bash
# Tests unitaires
poetry run pytest

# Avec couverture
poetry run coverage run -m pytest
poetry run coverage report -m

# Test scraper CLI
SCRAPE_TEST_MAX=0 poetry run python backend/app/scraper/run_scrape_tests.py
```

---

## Qualité de Code

| Outil | Version | Description |
|-------|---------|-------------|
| **Ruff** | ^0.1 | Linter Python ultra-rapide (remplace flake8, isort) |
| **MyPy** | ^1.9 | Vérification de types statique |
| **Pre-commit** | ^3.5 | Hooks Git pour qualité automatique |

### Configuration Pre-commit
```bash
# Installation des hooks
pre-commit install

# Exécution manuelle
pre-commit run --all-files
```

---

## Déploiement

### Docker
| Outil | Description |
|-------|-------------|
| **Docker** | Conteneurisation des services |
| **Docker Compose** | Orchestration multi-conteneurs |
| **Nginx** | Serveur web pour le frontend (reverse proxy) |

### Images Docker
| Service | Base | Description |
|---------|------|-------------|
| Backend | `python:3.11-slim` | FastAPI + Playwright + Chromium |
| Frontend | `node:20-alpine` → `nginx:alpine` | Build Vite + serveur Nginx |

### Volumes
| Volume | Contenu |
|--------|---------|
| `suivi_produit_data` | SQLite + raw JSON |
| `suivi_produit_logs` | Fichiers de log |

### Ports
| Service | Port interne | Port exposé |
|---------|--------------|-------------|
| Backend | 8008 | 8008 |
| Frontend | 80 | 8080 |

---

## Versionnement

| Outil | Description |
|-------|-------------|
| **Git** | Contrôle de version |
| **Gitea** | Serveur Git self-hosted |

### Conventions de commit
Format : `type: description`

| Type | Description |
|------|-------------|
| `feat` | Nouvelle fonctionnalité |
| `fix` | Correction de bug |
| `refactor` | Refactorisation sans changement fonctionnel |
| `docs` | Documentation |
| `style` | Formatage, pas de changement de code |
| `test` | Ajout ou modification de tests |
| `chore` | Maintenance, dépendances |

---

## Structure des Fichiers de Configuration

| Fichier | Description |
|---------|-------------|
| `pyproject.toml` | Config Poetry, dépendances Python, scripts |
| `backend/config_backend.json` | Paramètres scraping, stores, taxonomie |
| `frontend/config_frontend.json` | Thème, layout, champs visibles |
| `.env` | Variables d'environnement (non versionné) |
| `.env.example` | Template des variables d'environnement |
| `.env.docker` | Config pour déploiement Docker |
| `docker-compose.yml` | Définition des services Docker |

---

## Diagramme d'Architecture

```
┌─────────────────────────────────────────────────────────────┐
│                        Client (Browser)                      │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                     Frontend (Nginx :8080)                   │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  React 18 + Vite + Zustand + Chart.js               │    │
│  │  Thème Gruvbox Dark                                  │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘
                              │ /api/*
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                     Backend (FastAPI :8008)                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
│  │   API REST   │  │  Scheduler   │  │   Scraper    │       │
│  │   (Routes)   │  │ (APScheduler)│  │ (Playwright) │       │
│  └──────────────┘  └──────────────┘  └──────────────┘       │
│                              │                               │
│                              ▼                               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              SQLAlchemy ORM + SQLite                 │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                     Stockage Persistant                      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
│  │   suivi.db   │  │  data/raw/   │  │    logs/     │       │
│  │   (SQLite)   │  │  (JSON)      │  │  (Loguru)    │       │
│  └──────────────┘  └──────────────┘  └──────────────┘       │
└─────────────────────────────────────────────────────────────┘
```
