# TODO - PriceWatch

Liste des tâches priorisées pour le développement de PriceWatch.

## Légende
- [ ] À faire
- [x] Terminé
- [~] En cours

---

## Phase 1 : Fondations CLI

### Étape 1 : Documentation et structure
- [x] Créer README.md complet
- [x] Créer TODO.md (ce fichier)
- [x] Créer CHANGELOG.md
- [x] Créer structure des dossiers du projet
- [x] Créer pyproject.toml avec dépendances

### Étape 2 : Modèle de données
- [x] Implémenter ProductSnapshot (Pydantic) dans core/schema.py
  - [x] Champs métadonnées (source, url, fetched_at)
  - [x] Champs produit (title, price, currency, shipping_cost, stock_status, reference, images, category, specs)
  - [x] Champs debug (method, errors, notes, status)
  - [x] Validation et serialization JSON

### Étape 3 : Core utilitaires
- [x] Implémenter core/logging.py
  - [x] Configuration logger avec niveaux (DEBUG, INFO, ERROR)
  - [x] Formatage des logs
- [x] Implémenter core/io.py
  - [x] Lecture YAML (scrap_url.yaml)
  - [x] Écriture JSON (scraped_store.json)
  - [x] Validation des fichiers

### Étape 4 : Architecture des stores
- [x] Implémenter BaseStore abstrait (stores/base.py)
  - [x] Méthode match(url) -> float
  - [x] Méthode canonicalize(url) -> str
  - [x] Méthode extract_reference(url) -> str
  - [x] Méthode fetch(url, method, options) -> str
  - [x] Méthode parse(html, url) -> ProductSnapshot
- [x] Implémenter Registry (core/registry.py)
  - [x] Enregistrement dynamique des stores
  - [x] Détection automatique du store depuis URL
  - [x] Méthode get_best_store(url)

### Étape 5 : Scraping
- [x] Implémenter scraping/http_fetch.py
  - [x] Fonction fetch_http(url, timeout, headers)
  - [x] Gestion des erreurs (403, timeout, connexion)
  - [x] User-Agent rotation
  - [x] Logging détaillé
- [x] Implémenter scraping/pw_fetch.py
  - [x] Fonction fetch_playwright(url, options)
  - [x] Support headless/headful
  - [x] Sauvegarde HTML optionnelle
  - [x] Screenshot optionnel
  - [x] Timeout configurable
  - [x] Logging détaillé

### Étape 6 : Store Amazon
- [x] Créer structure stores/amazon/
- [x] Implémenter stores/amazon/store.py (AmazonStore)
  - [x] match() : détection amazon.fr/amazon.com
  - [x] canonicalize() : nettoyage URL vers /dp/{ASIN}
  - [x] extract_reference() : extraction ASIN
  - [x] parse() : parsing HTML vers ProductSnapshot
- [x] Créer stores/amazon/selectors.yml
  - [x] Sélecteurs pour title
  - [x] Sélecteurs pour price
  - [x] Sélecteurs pour currency
  - [x] Sélecteurs pour shipping_cost
  - [x] Sélecteurs pour stock_status
  - [x] Sélecteurs pour images
  - [x] Sélecteurs pour category
  - [x] Sélecteurs pour specs
- [ ] Ajouter fixtures HTML dans stores/amazon/fixtures/

### Étape 7 : Store Cdiscount
- [x] Créer structure stores/cdiscount/
- [x] Implémenter stores/cdiscount/store.py (CdiscountStore)
  - [x] match() : détection cdiscount.com
  - [x] canonicalize() : nettoyage URL
  - [x] extract_reference() : extraction SKU
  - [x] parse() : parsing HTML vers ProductSnapshot
- [x] Créer stores/cdiscount/selectors.yml
  - [x] Sélecteurs pour tous les champs ProductSnapshot
- [ ] Ajouter fixtures HTML dans stores/cdiscount/fixtures/

### Étape 8 : CLI
- [x] Implémenter cli/main.py avec Typer
  - [x] Commande `pricewatch run`
  - [x] Commande `pricewatch detect`
  - [x] Commande `pricewatch fetch`
  - [x] Commande `pricewatch parse`
  - [x] Commande `pricewatch doctor`
  - [x] Flag --debug global
  - [x] Logging vers console

### Étape 9 : Tests
- [x] Configurer pytest dans pyproject.toml
- [x] Tests core/schema.py (29 tests - 100% coverage)
  - [x] Validation ProductSnapshot
  - [x] Serialization JSON
- [x] Tests core/registry.py (40 tests - 100% coverage)
  - [x] Enregistrement stores
  - [x] Détection automatique
  - [x] Tests d'intégration avec 4 stores réels
- [x] Tests core/io.py (36 tests - 97% coverage)
  - [x] Lecture/écriture YAML/JSON
  - [x] Sauvegarde debug HTML/screenshots
- [x] Tests stores/amazon/ (33 tests - 89% coverage)
  - [x] match() avec différentes URLs
  - [x] canonicalize()
  - [x] extract_reference()
  - [x] parse() sur fixtures HTML
- [x] Tests stores/cdiscount/ (30 tests - 72% coverage)
  - [x] Tests complets avec fixtures réels
- [x] Tests stores/backmarket/ (25 tests - 85% coverage)
  - [x] Tests complets avec fixtures réels
- [x] Tests stores/aliexpress/ (32 tests - 85% coverage)
  - [x] Tests complets avec fixtures réels
- [x] Tests scraping/ (42 tests)
  - [x] http_fetch avec mock (21 tests - 100% coverage)
  - [x] pw_fetch avec mock (21 tests - 91% coverage)

### Étape 10 : Intégration et validation
- [x] Créer scrap_url.yaml exemple
- [x] Tester pipeline complet YAML → JSON
- [x] Tester avec vraies URLs Amazon
- [x] Tester avec vraies URLs Cdiscount
- [x] Vérifier tous les modes de debug
- [x] Valider sauvegarde HTML/screenshots
- [x] Documentation finale

### ✅ PHASE 1 TERMINÉE À 100%
**État final**: 295 tests passent / 295 tests totaux (100%)
**Coverage global**: 76%

**Détail par module**:
- ✅ core/schema.py: 100% coverage
- ✅ core/registry.py: 100% coverage (40 tests)
- ✅ core/io.py: 97% coverage (36 tests)
- ✅ scraping/http_fetch.py: 100% coverage (21 tests)
- ✅ scraping/pw_fetch.py: 91% coverage (21 tests)
- ✅ stores/amazon/: 89% coverage (33 tests)
- ✅ stores/aliexpress/: 85% coverage (32 tests)
- ✅ stores/backmarket/: 85% coverage (25 tests)
- ✅ stores/cdiscount/: 72% coverage (30 tests)

**4 stores opérationnels**: Amazon, Cdiscount, Backmarket, AliExpress

---

## Phase 2 : Base de données (Terminee)

### Persistence
- [x] Schéma PostgreSQL
- [x] Migrations Alembic
- [x] Models SQLAlchemy
- [x] Connexion DB (engine, session, init)
- [x] Tests DB de base
- [x] Repository pattern (ProductRepository)
- [x] ScrapingPipeline (persistence optionnelle)
- [x] CLI `--save-db/--no-db`
- [x] Tests end-to-end CLI + DB
- [x] Tests backward compatibility (`--no-db`)
- [x] Tests performance (100+ produits)
- [x] CRUD produits
- [x] Historique prix

### Documentation
- [x] Migration guide (JSON -> DB)

### Configuration
- [x] Fichier config (DB credentials)
- [x] Variables d'environnement
- [x] Docker Compose PostgreSQL/Redis

---

## Phase 3 : Worker et automation (En cours)

### Worker
- [x] Setup Redis
- [x] Worker RQ
- [x] Queue de scraping
- [x] Tests worker + scheduler
- [x] Gestion erreurs Redis (RedisUnavailableError)
- [ ] Retry policy

### Planification
- [x] Cron ou scheduler intégré
- [x] Scraping quotidien automatique
- [x] Logs des runs (JOB START/OK/FAILED)
- [x] Tests end-to-end worker + DB
- [x] Tests end-to-end CLI -> DB -> worker

## Phase 3 : API REST (En cours)

### API FastAPI
- [x] Endpoints read-only (products, prices, logs, health)
- [x] Auth token simple (Bearer)
- [x] Endpoints enqueue/schedule
- [x] CRUD products + prices + logs
- [x] Docker + uvicorn + config env
- [x] Tests API de base
- [x] Filtres avances (prix, dates, stock, status)
- [x] Exports CSV/JSON (products, prices, logs)
- [x] Webhooks (CRUD + test)

---

## Phase 4 : Web UI (Future)

### Backend API
- [x] FastAPI endpoints
- [x] Authentification
- [ ] CORS

### Frontend
- [x] Framework (Vue 3 + Vite)
- [x] Design responsive (layout dense + compact)
- [x] Dark theme Gruvbox (defaut) + Monokai
- [ ] Graphiques historique prix
- [ ] Gestion alertes

---

## Phase 5 : Alertes (Future)

### Notifications
- [ ] Système d'alertes (baisse prix, retour stock)
- [ ] Email
- [ ] Webhooks
- [ ] Push notifications

---

## Améliorations techniques

### Performance
- [ ] Cache Redis pour résultats
- [ ] Rate limiting par store
- [ ] Parallélisation scraping

### Robustesse
- [ ] Retry automatique sur échec
- [ ] Circuit breaker
- [ ] Monitoring (Prometheus?)

### Extensibilité
- [ ] Plugin system pour nouveaux stores
- [ ] Configuration stores externe
- [ ] API publique

---

**Dernière mise à jour**: 2026-01-15
