# StudyFlash 🎓⚡

Application de révision moderne — **flashcards, QCM, réponses libres et mode infini** — avec suivi de progression par cours et par chapitre, séries (streaks) et back-office d'administration.

Refonte **Laravel** d'une application Next.js d'origine : toutes les fonctionnalités sont conservées, l'UI/UX a été entièrement repensée (sombre, responsive, animée), et les cartes ont été ré-extraites et **dédupliquées** depuis les fiches de cours.

## ✨ Fonctionnalités

- **Authentification** par sessions (inscription, connexion, rôles `user` / `admin`, comptes suspendables).
- **2 cours, 21 chapitres, 491 cartes** dédupliquées (Développement Web · Dev Mobile & REST).
- **Jouable par chapitre OU sur le cours complet** (doublons retirés à la volée en mode cours complet).
- **4 modes de révision :**
  - 🃏 **Flashcards** — retourne la carte (flip 3D), évalue ta mémoire.
  - 🎯 **QCM** — 4 réponses possibles, distracteurs tirés du même chapitre.
  - ✍️ **Réponse libre** — rédige de mémoire, scoring par similarité.
  - ♾️ **Mode infini** — les cartes ratées reviennent, les réussites sortent, jusqu'à tout maîtriser.
- **Tableau de bord** : réussite globale, réponses, meilleure série, anneaux de progression.
- **Profil** : statistiques détaillées par cours.
- **Back-office admin** : stats globales, liste/recherche/pagination des utilisateurs, détail d'un utilisateur, suspension/réactivation.
- **Raccourcis clavier** (Espace, ←/→, J/F, Ctrl+Entrée), **confettis**, micro-interactions, **responsive** (barre de navigation basse sur mobile), accessibilité (focus, ARIA, `prefers-reduced-motion`).

## 🛠️ Stack

- **Laravel 13** (PHP 8.3+) · SQLite
- **Blade** + composants · **Tailwind CSS v4** · **Alpine.js** · **Vite**
- Polices : Space Grotesk (titres) · Inter (texte) · JetBrains Mono (code) — via [Bunny Fonts](https://fonts.bunny.net)

## 🚀 Installation

```bash
# 1. Dépendances
composer install
npm install

# 2. Environnement (un .env est déjà fourni)
php artisan key:generate

# 3. Base de données SQLite : crée le fichier, migre + seed (cours, chapitres, cartes, admin, démo)
touch database/database.sqlite
php artisan migrate:fresh --seed

# 4. Assets
npm run build      # ou `npm run dev` en développement

# 5. Lancer
php artisan serve  # http://127.0.0.1:8000
```

## 🔑 Comptes de démonstration

| Rôle  | Email                     | Mot de passe |
|-------|---------------------------|--------------|
| Admin | `admin@studyflash.local`  | `Admin1234!` |
| Démo  | `demo@studyflash.local`   | `demo1234`   |

(Modifiables via `ADMIN_*` / `DEMO_*` dans le `.env`.)

## 🗂️ Données pédagogiques

Les cartes sont curées dans **`database/data/courses.json`** (Cours → Chapitres → Cartes) et chargées par `CourseSeeder`. Elles ont été extraites des fiches de révision et glossaires (Développement Web ; Dev Mobile / Kotlin / Android ; Services REST en Java), fusionnées et dédupliquées chapitre par chapitre.

Pour recharger uniquement les cartes : `php artisan db:seed --class=CourseSeeder`.

## 🧱 Architecture

```
app/
  Http/Controllers/   Auth, Dashboard, Course, Study, Progress, Profile, Admin/*
  Http/Middleware/    EnsureUserIsAdmin
  Models/             User, Course, Chapter, Card, Progress, UserCourseStat
  Services/           QuizService (génération des QCM)
database/
  data/courses.json   Contenu pédagogique (source des seeds)
  migrations/ · seeders/
resources/
  css/app.css         Design system (tokens, composants, animations)
  js/app.js           Alpine : flashcards / qcm / openAnswer / infinite + helpers
  views/              Blade : layouts, composants UI, pages
routes/web.php
```

Itinéraire de jeu : `GET /study/{course}/{scope}/{mode}` où `scope` = `all` (cours complet) ou le slug d'un chapitre, et `mode` ∈ `flashcards|qcm|open|infinite`.

## ✅ Tests

```bash
php artisan test     # ou : php vendor/bin/phpunit
```

La suite `SmokeTest` rend chaque page (dashboard, profil, hub de cours, les 4 modes × cours complet & chapitre × 2 cours, admin) et vérifie l'authentification, l'enregistrement de la progression, les séries et la protection de l'espace admin.
