# Voyage.ia

Application privée pour préparer et suivre le voyage de la famille Badin :
**Île Maurice (12 → 21 octobre 2026)** puis **La Réunion (21 → 30 octobre 2026)**.

Itinéraire jour par jour, hébergements, activités/randos/restos (avec suggestions par
l'IA Gemini), coffre-fort documents (passeports, visas, billets…), réservations,
checklist et budget partagés. Accès réservé à Stéphane et Morgane (connexion Google).

Pensée mobile d'abord : une fois déployée, ouvrez le site sur votre téléphone puis
« Ajouter à l'écran d'accueil » pour l'utiliser comme une app.

---

## 1. Architecture en un coup d'œil

- **Hébergement** : votre mutualisé OVH existant (`stefandmomo.fr`), en **PHP 8.5**.
- **Aucun framework, aucun Composer** : PHP « vanilla » + PDO côté serveur, JS natif
  côté client. Déploiement possible par simple FTP.
- **Base de données** : MySQL (une des 5 bases disponibles sur votre offre OVH).
- **Authentification** : Google OAuth2, accès restreint à une liste blanche de 2 emails.
- **IA** : appels serveur→serveur vers l'API Gemini (clé API jamais exposée au navigateur).

```
Voyage.ia/
  config/      -> HORS ligne, à uploader hors du dossier public (contient les secrets)
  src/         -> HORS ligne, classes PHP partagées
  storage/     -> HORS ligne, fichiers uploadés (passeports, billets...)
  public/      -> EN LIGNE, à uploader dans le docroot du (sous-)domaine
  schema.sql   -> à importer une fois dans phpMyAdmin
```

**Important** : `config/`, `src/` et `storage/` ne doivent JAMAIS être accessibles par
une URL. Sur OVH, tout ce qui se trouve dans le dossier configuré comme "racine du
site" est public — tout le reste ne l'est pas. On les place donc à côté du docroot,
pas dedans.

---

## 2. Étape 1 — Sous-domaine et base de données (panel OVH)

1. Dans l'onglet **Multisite** de votre hébergement, créez un nouveau site, par
   exemple sur le sous-domaine `voyage.stefandmomo.fr`. Choisissez un **dossier
   dédié**, par exemple `voyage/www` (c'est ce dossier `www` qui sera le docroot
   public — `config/`, `src/`, `storage/` iront dans `voyage/`, à côté de `www/`).
2. Dans l'onglet **Bases de données**, créez une base MySQL dédiée au projet. Notez
   le nom de la base, l'utilisateur, le mot de passe et le serveur (`host`).
3. Dans l'onglet **Certificats SSL**, activez le certificat Let's Encrypt gratuit
   pour `voyage.stefandmomo.fr` (peut prendre quelques minutes à se propager).

---

## 3. Étape 2 — Connexion Google (OAuth2)

1. Allez sur [Google Cloud Console](https://console.cloud.google.com/) et sélectionnez
   votre projet GCP existant (celui que vous utilisez déjà).
2. **APIs & Services > Écran de consentement OAuth** :
   - Type d'utilisateur : *Externe*.
   - Nom de l'appli : « Voyage.ia » (ou ce que vous voulez).
   - Ajoutez vos deux adresses Gmail comme **utilisateurs de test** — tant que
     l'appli reste en mode « Test », seuls ces comptes peuvent se connecter, ce qui
     ajoute une couche de sécurité supplémentaire (en plus de la liste blanche
     côté serveur).
3. **APIs & Services > Identifiants > Créer des identifiants > ID client OAuth** :
   - Type d'application : *Application Web*.
   - URI de redirection autorisée : `https://voyage.stefandmomo.fr/oauth_callback.php`
     (à adapter si vous changez le sous-domaine).
   - Notez le **Client ID** et le **Client Secret** générés.

---

## 4. Étape 3 — Clé API Gemini

1. Allez sur [Google AI Studio](https://aistudio.google.com/apikey).
2. Créez une clé API en la liant à votre **projet GCP existant** (celui utilisé
   ci-dessus) plutôt qu'à un nouveau projet.
3. Notez la clé. Le modèle utilisé par défaut est `gemini-2.5-flash` (rapide et
   économique — largement suffisant pour un usage familial ; modifiable dans
   `config.php` si besoin).
4. Coût : avec un usage occasionnel (quelques suggestions/questions par semaine),
   vous resterez très probablement dans le [niveau gratuit](https://ai.google.dev/pricing)
   de l'API. Surveillez la facturation depuis la Google Cloud Console par précaution.

---

## 5. Étape 4 — Configuration

1. Copiez `config/config.sample.php` vers `config/config.php`.
2. Ouvrez `config/config.php` et complétez :
   - `db` : host / nom / utilisateur / mot de passe de la base créée à l'étape 1.
   - `app.base_url` : `https://voyage.stefandmomo.fr`.
   - `app.app_secret` : générez une chaîne aléatoire, par exemple avec
     `php -r "echo bin2hex(random_bytes(32));"` (ou n'importe quel générateur de
     mot de passe long).
   - `auth.allowed_emails` : votre adresse **et celle de Morgane** (actuellement un
     placeholder à remplacer).
   - `auth.google_client_id` / `google_client_secret` / `google_redirect_uri` :
     valeurs de l'étape 2.
   - `gemini.api_key` : clé de l'étape 3.

`config.php` contient des secrets : ne le publiez jamais (ni sur GitHub, ni dans le
dossier public du site).

---

## 6. Étape 5 — Base de données

Dans le panel OVH, ouvrez **phpMyAdmin** (lien depuis l'onglet Bases de données),
sélectionnez votre base, onglet **Importer**, et importez le fichier `schema.sql`
à la racine du projet. Cela crée toutes les tables et ajoute :
- les deux étapes du voyage (Maurice / Réunion) avec les bonnes dates,
- quelques éléments de checklist de démarrage (modifiables/supprimables dans l'appli).

---

## 7. Étape 6 — Déploiement des fichiers (FTP ou SSH)

Utilisez l'onglet **FTP - SSH** du panel OVH pour récupérer vos identifiants, puis
avec un client FTP (FileZilla...) ou `scp`/`sftp` :

1. Uploadez le **contenu** du dossier `public/` dans `voyage/www/` (le docroot créé
   à l'étape 1) — c'est-à-dire que `index.php`, `app.php`, `assets/`, `api/`, etc.
   se retrouvent directement dans `www/`, pas dans un sous-dossier `public/`.
2. Uploadez les dossiers `config/`, `src/` et `storage/` dans `voyage/` (à côté de
   `www/`, donc **hors** du docroot).
3. Vérifiez les droits : `storage/documents/` doit être accessible en écriture par
   PHP (droits 750/770 selon la config, PHP créera le dossier automatiquement au
   premier upload s'il n'existe pas).

Arborescence finale attendue sur le serveur :
```
voyage/
  config/config.php
  src/*.php
  storage/documents/        (créé automatiquement)
  www/                      <- docroot du sous-domaine
    index.php, app.php, login.php, ...
    api/*.php
    assets/...
```

---

## 8. Étape 7 — Vérification

Checklist à dérouler une fois déployé :

- [ ] `https://voyage.stefandmomo.fr` redirige vers l'écran de connexion.
- [ ] Le cadenas HTTPS est actif (certificat SSL propagé).
- [ ] « Se connecter avec Google » fonctionne avec votre compte, et avec celui de
      Morgane. Un compte hors liste blanche doit être refusé avec un message clair.
- [ ] Les deux étapes (Maurice / Réunion) apparaissent en haut de l'app avec les
      bonnes dates.
- [ ] Ajouter un élément d'itinéraire, un hébergement, une activité fonctionne et
      persiste après rechargement de la page.
- [ ] « Suggérer avec Gemini » (onglet Activités) renvoie des propositions.
- [ ] Upload d'un document dans le Coffre-fort (essayez avec un PDF ou une photo de
      test — pas un vrai passeport tant que le test n'est pas concluant), puis
      téléchargement et suppression fonctionnent.
- [ ] L'onglet Assistant répond à un message.
- [ ] Sur votre téléphone : Safari/Chrome propose « Ajouter à l'écran d'accueil »,
      et l'app s'ouvre en plein écran comme une vraie app.

---

## 9. Sécurité — ce qui est déjà en place

- Accès applicatif limité à 2 adresses email (vérifiées côté serveur, pas seulement
  côté Google) + option de restreindre en mode "Test" côté Google Cloud Console.
- Sessions HTTP-only, cookie `Secure` dès que le site est servi en HTTPS.
- Les documents uploadés sont stockés **hors du dossier public**, sous un nom de
  fichier aléatoire ; le nom d'origine et les métadonnées ne sont visibles qu'après
  authentification. Aucune URL directe ne permet d'y accéder sans être connecté.
- Toutes les requêtes SQL sont préparées (PDO), colonnes en liste blanche
  (`src/Repository.php`) : pas d'injection SQL possible depuis les entrées utilisateur.
- La clé API Gemini et les secrets OAuth restent côté serveur (`config/config.php`,
  jamais exposés au navigateur).

Pistes d'amélioration futures (non nécessaires pour un usage privé à 2, mais
mentionnées pour info) : chiffrement au repos des fichiers du coffre-fort (AES),
2FA, journal d'accès aux documents.

---

## 10. Pour aller plus loin (optionnel, plus tard)

- **Réservations** : la section "Coffre-fort" permet de créer des réservations
  (vol, hôtel, voiture...) et de lier un document à une réservation précise.
- **Budget** : total et répartition par personne affichés en haut de l'onglet Budget,
  par étape du voyage.
- Le modèle Gemini (`gemini.model` dans `config.php`) peut être changé si vous
  voulez plus de qualité au détriment de la vitesse/coût (voir modèles disponibles
  sur [ai.google.dev](https://ai.google.dev/gemini-api/docs/models)).
- Pour changer les dates ou ajouter une 3ᵉ étape de voyage, modifiez/ajoutez une
  ligne dans la table `legs` (via phpMyAdmin, ou en exposant l'écriture depuis
  l'appli si besoin plus tard).
