# Six Degrees of Kevin Bacon

Jeu web inspiré du concept des **six degrés de séparation** (variante "Six Degrees of Kevin Bacon"). Le but : relier deux acteurs entre eux en passant par des films qu'ils ont tournés en commun, en un minimum d'étapes.

- **Dépôt** : https://git.hugo-pierret.be/Hugyouu/six-degrees
- **App** : https://six-degrees.hugo-pierret.be

---

## Fonctionnalités

- **Défi quotidien** — une paire d'acteurs par jour, commune à tous les joueurs
- **Mode infini** — parties en solo avec des paires aléatoires
- **Multijoueur temps réel** — lobbys via WebSocket (SignalR)
- **Calendrier** — historique des défis quotidiens passés
- **Visualisation graphe** — représentation interactive acteur → film → acteur (D3.js)

---

## Stack technique

| Couche | Technologie |
|--------|-------------|
| Backend | ASP.NET Core 8.0 (C#) |
| Base de données | PostgreSQL + Entity Framework Core 8.0 |
| Temps réel | SignalR |
| Frontend | React 18 + Vite |
| Styles | Tailwind CSS + Material Tailwind |
| Graphe | react-force-graph-2d (D3.js) |
| API externe | TMDB |
| Déploiement | Docker + Docker Compose |

---

## Architecture

```
six-degrees/
├── backend/
│   ├── SixDegrees.Api/            # Contrôleurs, hubs SignalR, config
│   ├── SixDegrees.Domain/         # Logique métier, services, entités
│   └── SixDegrees.Infrastructure/ # Accès données, migrations EF Core
├── frontend/
│   └── src/
│       ├── pages/                 # Vues (Home, DailyChallenge, Lobby…)
│       ├── components/            # Composants réutilisables
│       └── hooks/                 # Hooks custom (SignalR, username…)
├── docker-compose.yml
└── .env.example
```

### Algorithme

**Bidirectional BFS** pour trouver le chemin le plus court entre deux acteurs (profondeur max = 6 degrés).

### Modèle de données

Stocké en PostgreSQL via Entity Framework Core :

- **Person** `{ id, name, popularity }` — acteurs/célébrités
- **Title** `{ id, name, year, type }` — films et séries
- **Relation** `Person → Title` (ACTED_IN)

Données importées depuis l'API TMDB.

---

## Lancer le projet

### Prérequis

- Docker et Docker Compose
- Clés API TMDB (compte gratuit sur [themoviedb.org](https://www.themoviedb.org/))

### Démarrage rapide

```bash
cp .env.example .env
# Remplir TMDB_API_KEY, TMDB_ACCESS_TOKEN, etc.
docker compose up --build
```

Application disponible sur `http://localhost` (ou `APP_PORT`).

### Variables d'environnement

| Variable | Description |
|----------|-------------|
| `TMDB_API_KEY` | Clé API TMDB (requise) |
| `TMDB_ACCESS_TOKEN` | Token d'accès TMDB (requis) |
| `DB_CONNECTION_STRING` | Chaîne de connexion PostgreSQL |
| `APP_PORT` | Port exposé pour le frontend (défaut : `80`) |

---

## Développement local

**Backend**

```bash
cd backend
dotnet restore
dotnet run --project SixDegrees.Api/
# API sur http://localhost:8080
# Swagger : http://localhost:8080/swagger
```

**Frontend**

```bash
cd frontend
npm install
npm run dev
# Dev server sur http://localhost:5173
```

---

## CI/CD

Workflow Gitea (`.gitea/workflows/deploy.yaml`) déclenché automatiquement sur chaque tag `v*.*.*` — rebuild et redéploiement via Docker Compose.

```bash
git tag v1.0.0
git push --tags
```

---

## Notes de conception initiale

Lors de la phase de prototype, plusieurs choix ont été évalués :

| Critère | Option retenue | Alternatives envisagées |
|---------|---------------|-------------------------|
| BDD graphe | PostgreSQL + EF Core | Apache AGE (extension PG), Neo4j |
| Backend | ASP.NET Core (C#) | Node.js / Express |
| Algo chemin | Bidirectional BFS | BFS simple, Dijkstra |
| Source données | TMDB | Wikidata, IMDb |

### Scoring (mode challenge)

- **Base** : `(6 - degrés) × 100` points
- **Bonus temps** : +50 pts si trouvé en moins d'1 minute
- **Bonus rareté** : +50 pts si le chemin inclut un titre peu populaire