# 🎉 AfterWork - Application Mobile de Réseau Social d'Événements

<div align="center">

![Flutter](https://img.shields.io/badge/Flutter-3.5.1-02569B?logo=flutter)
![Dart](https://img.shields.io/badge/Dart-3.5.1-0175C2?logo=dart)
![License](https://img.shields.io/badge/License-Private-red)
![Status](https://img.shields.io/badge/Status-En%20Développement-yellow)

Une application mobile multiplateforme permettant de créer, gérer et participer à des événements sociaux avec vos amis.

</div>

---

## 📋 Table des Matières

- [À propos](#-à-propos)
- [Fonctionnalités](#-fonctionnalités)
- [Architecture](#-architecture)
- [Technologies](#-technologies)
- [Installation](#-installation)
- [Configuration](#-configuration)
- [Structure du Projet](#-structure-du-projet)
- [Développement](#-développement)
- [Tests](#-tests)
- [Déploiement](#-déploiement)
- [Contribution](#-contribution)
- [Documentation API](#-documentation-api)

---

## 🎯 À propos

**AfterWork** est une plateforme sociale mobile complète qui permet aux utilisateurs de :
- Organiser et découvrir des événements sociaux
- Se connecter avec des amis et étendre leur réseau
- Partager des moments via des stories et posts
- Gérer leurs participations et réservations
- Explorer des établissements et lieux d'intérêt

L'application est construite avec Flutter pour assurer une expérience native sur toutes les plateformes (iOS, Android, Web, Windows, Linux, macOS).

---

## ✨ Fonctionnalités

### 🎪 Gestion des Événements
- ✅ Création d'événements avec images, catégories et localisation
- ✅ Visualisation des événements personnels et des amis
- ✅ Système de participation/désistement
- ✅ Fermeture et réouverture d'événements
- ✅ Réactions, commentaires et partages
- ✅ Filtrage par catégorie et recherche avancée

### 👥 Réseau Social
- ✅ Système d'amis complet (envoi, acceptation, blocage)
- ✅ Posts sociaux avec images
- ✅ Stories avec support vidéo
- ✅ Notifications en temps réel
- ✅ Profils utilisateurs enrichis avec statistiques

### 📍 Localisation
- ✅ Intégration Google Maps
- ✅ Sélecteur de localisation intuitif
- ✅ Exploration d'établissements

### 🎨 Personnalisation
- ✅ Thème clair/sombre avec persistance
- ✅ Images de profil personnalisées
- ✅ Paramètres utilisateur avancés

---

## 🏗 Architecture

Le projet suit les principes de **Clean Architecture** pour assurer la maintenabilité, la testabilité et la scalabilité :

```
lib/
├── core/                      # Noyau commun de l'application
│   ├── constants/            # Constantes (couleurs, URLs, config)
│   ├── errors/               # Gestion des erreurs et exceptions
│   ├── theme/                # Thèmes et styles
│   └── utils/                # Utilitaires réutilisables
│
├── domain/                    # Couche métier (logique pure)
│   ├── entities/             # Entités métier (User, Event, Friend)
│   ├── repositories/         # Interfaces des repositories
│   └── usecases/             # Cas d'utilisation métier
│
├── data/                      # Couche de données
│   ├── datasources/          # Sources de données (API, cache)
│   ├── models/               # DTOs et modèles de données
│   ├── repositories/         # Implémentations des repositories
│   ├── services/             # Services (storage, sécurité)
│   └── providers/            # Providers pour l'état global
│
└── presentation/              # Couche présentation (UI)
    ├── screens/              # Écrans de l'application
    ├── widgets/              # Widgets réutilisables
    ├── state_management/     # BLoC et gestion d'état
    └── routes/               # Gestion de la navigation
```

### Principes Appliqués
- **Separation of Concerns** : Séparation claire des responsabilités
- **Dependency Inversion** : Les couches de haut niveau ne dépendent pas des détails
- **Single Responsibility** : Chaque classe a une seule raison de changer
- **Interface Segregation** : Interfaces spécifiques plutôt que générales

---

## 🛠 Technologies

### Framework & Langage
- **Flutter** 3.5.1+ - Framework UI multiplateforme
- **Dart** 3.5.1+ - Langage de programmation

### Gestion d'État
- **flutter_bloc** 8.1.6 - Pattern BLoC pour la gestion d'état
- **provider** 6.1.2 - Gestion d'état simple
- **equatable** 2.0.5 - Comparaison d'objets facilitée

### Réseau & API
- **http** 1.2.1 - Client HTTP pour les requêtes API

### Stockage & Persistance
- **shared_preferences** 2.2.3 - Préférences utilisateur
- **flutter_secure_storage** 9.2.2 - Stockage sécurisé (credentials)
- **path_provider** 2.1.3 - Accès aux chemins de fichiers

### Médias & Caméra
- **image_picker** 1.1.1 - Sélection d'images
- **camerawesome** 2.1.0 - Fonctionnalités caméra avancées
- **video_player** 2.8.6 - Lecture vidéo

### Cartes & Localisation
- **google_maps_flutter** 2.7.0 - Intégration Google Maps
- **permission_handler** 11.3.1 - Gestion des permissions

### Sécurité
- **encrypt** 5.0.3 - Chiffrement de données
- **flutter_bcrypt** 1.0.8 - Hachage de mots de passe

### UI & Animations
- **flutter_spinkit** 5.2.1 - Indicateurs de chargement
- **carousel_slider** 5.0.0 - Carrousels d'images
- **loading_icon_button** 0.0.6 - Boutons avec état de chargement

### Utilitaires
- **intl** 0.19.0 - Internationalisation (dates en français)
- **logger** 2.3.0 - Logging avancé
- **dartz** 0.10.1 - Programmation fonctionnelle
- **get_it** 7.7.0 - Injection de dépendances

---

## 💻 Installation

### Prérequis

- Flutter SDK 3.5.1 ou supérieur
- Dart SDK 3.5.1 ou supérieur
- Android Studio / Xcode (pour le développement mobile)
- Git

### Étapes d'installation

1. **Cloner le repository**
```bash
git clone <repository-url>
cd afterwork
```

2. **Installer les dépendances**
```bash
flutter pub get
```

3. **Vérifier l'installation**
```bash
flutter doctor
```

4. **Configurer l'environnement** (voir section Configuration)

5. **Lancer l'application**
```bash
# Mode développement
flutter run

# Mode release
flutter run --release
```

---

## ⚙️ Configuration

### Variables d'Environnement

Créez un fichier `.env` à la racine du projet (copiez `.env.example`) :

```env
API_BASE_URL=http://192.168.1.145:8080
ENVIRONMENT=development
GOOGLE_MAPS_API_KEY=your_google_maps_api_key_here
```

### Configuration Build

Pour passer les variables au moment du build :

```bash
flutter run --dart-define=API_BASE_URL=https://api.production.com \
            --dart-define=ENVIRONMENT=production
```

### Configuration API Backend

L'URL de l'API backend est configurée dans `lib/core/constants/env_config.dart`.

**Endpoints principaux :**
- Authentification : `POST /users/authenticate`
- Événements : `GET /events`, `POST /events`, `PUT /events/{id}`
- Amis : endpoints de gestion des relations d'amitié

Voir la [Documentation API](#-documentation-api) pour plus de détails.

---

## 📁 Structure du Projet

```
afterwork/
├── android/              # Configuration Android
├── ios/                  # Configuration iOS
├── web/                  # Configuration Web
├── windows/              # Configuration Windows
├── linux/                # Configuration Linux
├── macos/                # Configuration macOS
├── lib/                  # Code source Dart
│   ├── main.dart        # Point d'entrée de l'application
│   ├── core/            # Code partagé
│   ├── domain/          # Logique métier
│   ├── data/            # Couche de données
│   └── presentation/    # UI et écrans
├── test/                 # Tests unitaires et widgets
├── assets/              # Ressources (images, fonts, etc.)
├── pubspec.yaml         # Dépendances du projet
├── analysis_options.yaml # Configuration du linter
└── README.md            # Ce fichier
```

---

## 👨‍💻 Développement

### Standards de Code

Le projet utilise des règles de linting strictes définies dans `analysis_options.yaml` :
- Utilisation obligatoire de `const` pour les widgets immuables
- Typage fort et inférence stricte
- Trailing commas pour une meilleure lisibilité
- Documentation des APIs publiques

### Formatage du Code

```bash
# Formater tout le code
dart format .

# Analyser le code
flutter analyze

# Appliquer les corrections automatiques
dart fix --apply
```

### Conventions de Nommage

- **Classes** : `PascalCase` (ex: `EventScreen`, `UserProvider`)
- **Fichiers** : `snake_case` (ex: `event_screen.dart`, `user_provider.dart`)
- **Variables/Fonctions** : `camelCase` (ex: `userId`, `getUserById`)
- **Constants** : `lowerCamelCase` (ex: `apiBaseUrl`)

### Git Workflow

1. Créer une branche pour chaque feature : `feature/nom-feature`
2. Commit avec des messages descriptifs
3. Pull request pour review avant merge

---

## 🧪 Tests

### Lancer les Tests

```bash
# Tous les tests
flutter test

# Tests avec coverage
flutter test --coverage

# Tests spécifiques
flutter test test/domain/entities/user_test.dart
```

### Types de Tests

- **Tests Unitaires** : Logique métier et utilitaires
- **Tests Widgets** : Composants UI isolés
- **Tests d'Intégration** : Flux utilisateur complets

---

## 🚀 Déploiement

### Android

```bash
# Build APK
flutter build apk --release

# Build App Bundle (recommandé pour Play Store)
flutter build appbundle --release
```

### iOS

```bash
# Build IPA
flutter build ios --release
```

### Web

```bash
# Build web
flutter build web --release
```

---

## 🤝 Contribution

Les contributions sont les bienvenues ! Pour contribuer :

1. Fork le projet
2. Créer une branche feature (`git checkout -b feature/AmazingFeature`)
3. Commit vos changements (`git commit -m 'Add: Amazing Feature'`)
4. Push vers la branche (`git push origin feature/AmazingFeature`)
5. Ouvrir une Pull Request

### Guidelines de Contribution

- Respecter les standards de code du projet
- Ajouter des tests pour les nouvelles fonctionnalités
- Documenter les changements dans le README si nécessaire
- S'assurer que `flutter analyze` ne retourne aucune erreur

---

## 📖 Documentation API

### Base URL
```
http://192.168.1.145:8080
```

### Authentification

#### POST /users/authenticate
Authentifie un utilisateur

**Body:**
```json
{
  "email": "user@example.com",
  "password": "hashedPassword"
}
```

**Response:**
```json
{
  "userId": "123",
  "firstName": "John",
  "lastName": "Doe",
  "email": "user@example.com",
  "token": "jwt_token_here"
}
```

### Événements

#### GET /events
Récupère tous les événements

#### POST /events
Crée un nouvel événement

**Body:**
```json
{
  "title": "After-work Tech",
  "description": "Soirée networking",
  "startDate": "2024-01-15T19:00:00Z",
  "location": "Paris, France",
  "category": "Networking",
  "creatorEmail": "user@example.com"
}
```

#### GET /events/{id}
Récupère un événement spécifique

#### PUT /events/{id}
Met à jour un événement

#### DELETE /events/{id}
Supprime un événement

#### PATCH /events/{id}/close
Ferme un événement

#### PATCH /events/{id}/reopen
Réouvre un événement

Pour plus de détails, consultez la documentation Swagger de l'API backend.

---

## 📝 Changelog

### Version 1.0.0 (En développement)
- ✅ Architecture Clean implémentée
- ✅ Gestion des événements complète
- ✅ Système d'amis fonctionnel
- ✅ Stories et posts sociaux
- ✅ Thème clair/sombre
- ✅ Intégration Google Maps
- 🔄 Tests en cours d'implémentation

---

## 📄 License

Ce projet est propriétaire. Tous droits réservés.

---

## 👥 Équipe

Développé avec ❤️ par l'équipe AfterWork

---

## 📞 Support

Pour toute question ou problème :
- Ouvrir une issue sur le repository
- Contacter l'équipe de développement

---

<div align="center">

**Fait avec Flutter 🚀**

</div>
