╔══════════════════════════════════════════════════════════════════════════════╗
║  MYKOLLECTOR® — PROMPT PHASE 1 : BASE DE DONNÉES                           ║
║  À utiliser avec : MKO_BDD.docx                                             ║
╚══════════════════════════════════════════════════════════════════════════════╝

## CONTEXTE

Tu vas générer les scripts SQL et PHP d'installation de la base de données
de la plateforme MyKollectOr®. La bible technique complète est fournie dans
MKO_BDD.docx — elle fait autorité sur tout ce document.

## CONTRAINTES TECHNIQUES ABSOLUES

- Hébergement : OVH Mutualisé Pro — PHP 8.1 — MySQL 8.0
- Engine : InnoDB UNIQUEMENT sur toutes les tables
- Charset : utf8mb4 sur toutes les tables et colonnes
- Pas de Docker, pas de Redis, pas de migrations Eloquent automatiques
- Deux bases distinctes : mykollufab (métier) + mykolluwork (pilotage)
- Le script doit fonctionner en CLI uniquement : php install.php
- Refuser toute exécution HTTP (vérifier php_sapi_name() === 'cli')

## CE QUE TU DOIS GÉNÉRER

### Fichier 1 : install_web.php

Script PHP exécutable VIA NAVIGATEUR (pas en CLI — hébergement OVH Mutualisé sans accès SSH simple).

Protection par token URL : https://api.mykollector.com/install_web.php?token=MKO_INSTALL_2026

Le script doit :

1. Vérifier que $_GET['token'] === 'MKO_INSTALL_2026' — sinon afficher 403 Forbidden et stopper
2. Vérifier que install.php.done n'existe PAS — sinon afficher message "Déjà installé" et stopper
3. Afficher une page HTML propre avec le résultat en temps réel (pas de page blanche)
4. Charger les variables depuis .env (file_get_contents + parse_ini_string ou lecture manuelle)
5. Se connecter aux deux bases MySQL via PDO
6. Créer toutes les tables de mykollufab (voir MKO_BDD.docx) avec CREATE TABLE IF NOT EXISTS
7. Créer toutes les tables de mykolluwork (voir MKO_BDD.docx sections 12.x)
8. Insérer les données initiales (voir section "Données initiales" ci-dessous)
9. Afficher dans la page HTML : ✅ ou ❌ pour chaque table créée
10. Générer un SETUP_TOKEN aléatoire (bin2hex(random_bytes(32))) et l'afficher en GROS dans la page
11. Afficher un message final : "⚠️ NOTEZ CE TOKEN — Il ne sera plus affiché. Supprimez install_web.php via FTP."
12. Créer le fichier install_web.php.done pour bloquer toute réexécution
13. NE PAS s'auto-supprimer (l'utilisateur supprime via FTP)

Format de la page HTML de résultat :
- Fond blanc, police Arial, couleurs vert/rouge pour OK/ERREUR
- Section "SETUP_TOKEN" encadrée en orange bien visible
- Instructions claires pour la suite (supprimer le fichier via FTP)

Le script doit utiliser CREATE TABLE IF NOT EXISTS partout.
Respecter EXACTEMENT les noms de tables, colonnes, types et index définis dans MKO_BDD.docx.

### Fichier 2 : install_check_web.php

Script de vérification post-installation exécutable VIA NAVIGATEUR.
Protection par token URL : https://api.mykollector.com/install_check_web.php?token=MKO_INSTALL_2026

- Affiche une page HTML avec ✅/❌ pour chaque table mykollufab et mykolluwork
- Vérifie les index critiques (voir MKO_BDD §4)
- Affiche le nombre de tables présentes vs attendues
- Pas de CLI — tout dans le navigateur

## DONNÉES INITIALES À INSÉRER

Après création des tables, insérer :

### Dans mykollufab.produits (3 parcours actifs) :
NOTE IMPORTANTE : les champs nom et prenom dans users sont NULL par défaut.
Le code doit TOUJOURS envoyer ces champs quand disponibles — ne jamais les omettre.

NOTE : Le système supporte toutes les pratiques sportives — pas uniquement le cyclisme.
Categorie ENUM : cyclisme / trail / course_pied / rando / autre

- Col de l'Izoard : slug=izoard, altitude=2360, distance_km=15.9, denivele=1095
  depart_lat=44.6782, depart_lng=6.7350, sommet_lat=44.8196, sommet_lng=6.7342, categorie=cyclisme
- Mont Ventoux : slug=ventoux, altitude=1909, distance_km=21.4, denivele=1617
  depart_lat=44.1237, depart_lng=5.1283, sommet_lat=44.1742, sommet_lng=5.2782
- Alpe d'Huez : slug=alpe-huez, altitude=1860, distance_km=13.8, denivele=1071
  depart_lat=45.0547, depart_lng=6.0336, sommet_lat=45.0913, sommet_lng=6.0667

### Dans mykollufab.segment_tracking_config (1 ligne par parcours, valeurs DEFAULT) :
wake_distance_m=2000, high_accuracy_start_distance_m=300,
pulse_high_accuracy_duration_s=10, pulse_low_accuracy_duration_s=45,
finish_high_accuracy_distance_m=400, cooldown_distance_m=150,
cooldown_time_s=40, strava_dedup_window_minutes=120

### Dans mykollufab.ateliers (1 atelier MKO interne) :
nom="MyKollectOr (Julien Carpentier)", email="julien@mykollector.com",
est_mko_interne=1, actif=1

### Dans mykolluwork.prestashop_config :
url="https://shop.mykollector.com",
client_id="MyKollectOrFab025",
client_secret="c618ba42622cab8753f9200ef8b21601"

### Dans mykolluwork.strava_config :
Lire STRAVA_CLIENT_ID et STRAVA_CLIENT_SECRET depuis .env

### Dans mykollufab.ps_import_queue (file retry PS — remplace fichier JSON) :
Table vide à la création — alimentée par le backend lors des échecs d'import PS.
Lock léger via champ locked_at (PAS de SELECT FOR UPDATE — deadlock OVH).
Champs : id, presta_order_id UNIQUE, tentatives, derniere_tentative, prochaine_tentative,
         statut ENUM(en_attente/en_cours/echec_permanent), erreur TEXT

### Dans mykolluwork.dropbox_config :
Laisser vide (configuré depuis l'interface admin après installation)

## INDEX CRITIQUES À NE PAS OUBLIER

Vérifier que ces index sont créés (voir MKO_BDD §4) :
- users : UNIQUE INDEX idx_email(email) + UNIQUE INDEX idx_presta(presta_customer_id)
- users : INDEX idx_strava(strava_id)
- chronos : INDEX idx_strava_activity(strava_activity_id)
- chronos : INDEX idx_user_produit_date(user_id, produit_id, date_debut) — CRITIQUE déduplication Strava
- commandes : UNIQUE KEY unique_presta_order(presta_order_id)
- commandes : INDEX idx_type_commande(type_commande)
- commandes : INDEX idx_statut(statut)
- notifications : INDEX idx_user_lu(user_id, lu)
- classements : UNIQUE KEY unique_user_produit(user_id, produit_id)
- chat_messages : INDEX idx_conv_created(conversation_id, created_at)
- lots : INDEX idx_statut_lot(statut)
- relances_log : INDEX idx_chrono_type(chrono_id, type_relance)

## FORMAT DE LIVRAISON ATTENDU

Livrer :
- install.php (script CLI principal)
- install_check.php (script de vérification)
- README_INSTALL.md (procédure d'installation en 5 étapes)

Le README_INSTALL.md doit contenir :
1. Prérequis (.env configuré avec DB_HOST, DB_NAME, DB_USER, DB_PASS pour les deux bases)
2. Exécution via navigateur — pas de CLI requis
3. Comment vérifier : php install_check.php
4. Que faire du SETUP_TOKEN affiché (le noter — nécessaire pour POST /api/setup)
5. Confirmer que install.php est renommé en install.php.done automatiquement
