# Notifications MQTT pour le Chat GEOSECTOR

## Vue d'ensemble

Ce système de notifications utilise MQTT pour fournir des notifications push en temps réel pour le module chat. Il offre une alternative légère à Firebase Cloud Messaging (FCM) et peut être auto-hébergé dans votre infrastructure.

## Architecture

### Composants principaux

1. **MqttNotificationService** (Flutter)
   - Service de notification côté client
   - Gère la connexion au broker MQTT
   - Traite les messages entrants
   - Affiche les notifications locales

2. **MqttConfig** (Flutter)
   - Configuration centralisée pour MQTT
   - Gestion des topics
   - Paramètres de connexion

3. **MqttNotificationSender** (PHP)
   - Service backend pour envoyer les notifications
   - Interface avec la base de données
   - Gestion des cibles d'audience

## Configuration du broker MQTT

### Container Incus

Le broker MQTT (Eclipse Mosquitto recommandé) doit être installé dans votre container Incus :

```bash
# Installer Mosquitto
apt-get update
apt-get install mosquitto mosquitto-clients

# Configurer Mosquitto
vi /etc/mosquitto/mosquitto.conf
```

Configuration recommandée :
```
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd

# Pour SSL/TLS
listener 8883
cafile /etc/mosquitto/ca.crt
certfile /etc/mosquitto/server.crt
keyfile /etc/mosquitto/server.key
```

### Sécurité

Pour un environnement de production, il est fortement recommandé :

1. D'utiliser SSL/TLS (port 8883)
2. De configurer l'authentification par mot de passe
3. De limiter les IPs pouvant se connecter
4. De configurer des ACLs pour restreindre l'accès aux topics

## Structure des topics MQTT

### Topics utilisateur
- `chat/user/{userId}/messages` - Messages personnels pour l'utilisateur
- `chat/user/{userId}/groups/{groupId}` - Messages des groupes de l'utilisateur

### Topics globaux
- `chat/announcement` - Annonces générales
- `chat/broadcast` - Diffusions à grande échelle

### Topics conversation
- `chat/conversation/{conversationId}` - Messages spécifiques à une conversation

## Intégration Flutter

### Dépendances requises

Ajoutez ces dépendances à votre `pubspec.yaml` :

```yaml
dependencies:
  mqtt5_client: ^4.0.0  # ou mqtt_client selon votre préférence
  flutter_local_notifications: ^17.0.0
```

### Initialisation

```dart
// Dans main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final notificationService = MqttNotificationService();
  await notificationService.initialize(userId: currentUserId);
  
  runApp(const GeoSectorApp());
}
```

### Utilisation

```dart
// Écouter les messages
notificationService.onMessageTap = (messageId) {
  // Naviguer vers le message
  Navigator.pushNamed(context, '/chat/$messageId');
};

// Publier un message
await notificationService.publishMessage(
  'chat/user/$userId/messages',
  {'content': 'Test message'},
);
```

## Gestion des notifications

### Paramètres utilisateur

Les utilisateurs peuvent configurer :
- Activation/désactivation des notifications
- Conversations en silencieux
- Mode "Ne pas déranger"
- Aperçu du contenu

### Persistance des notifications

Les notifications sont enregistrées dans la table `chat_notifications` pour :
- Traçabilité
- Statistiques
- Synchronisation

## Tests

### Test de connexion

```dart
final service = MqttNotificationService();
await service.initialize(userId: 'test_user');
// Vérifie les logs pour confirmer la connexion
```

### Test d'envoi

```php
$sender = new MqttNotificationSender($db, $mqttConfig);
$result = $sender->sendMessageNotification(
  'receiver_id',
  'sender_id',
  'message_id',
  'Test message',
  'conversation_id'
);
```

## Surveillance et maintenance

### Logs

Les logs sont disponibles dans :
- Logs Flutter (console debug)
- Logs Mosquitto (`/var/log/mosquitto/mosquitto.log`)
- Logs PHP (selon configuration)

### Métriques à surveiller

- Nombre de connexions actives
- Latence des messages
- Taux d'échec des notifications
- Consommation mémoire/CPU du broker

## Comparaison avec Firebase

### Avantages MQTT

1. **Auto-hébergé** : Contrôle total de l'infrastructure
2. **Léger** : Moins de ressources que Firebase
3. **Coût** : Gratuit (uniquement coûts d'infrastructure)
4. **Personnalisable** : Configuration fine du broker

### Inconvénients

1. **Maintenance** : Nécessite une gestion du broker
2. **Évolutivité** : Requiert dimensionnement et clustering
3. **Fonctionnalités** : Moins de services intégrés que Firebase

## Évolutions futures

1. **WebSocket** : Ajout optionnel pour temps réel strict
2. **Clustering** : Pour haute disponibilité
3. **Analytics** : Dashboard de monitoring
4. **Webhooks** : Intégration avec d'autres services

## Dépannage

### Problèmes courants

1. **Connexion échouée**
   - Vérifier username/password
   - Vérifier port/hostname
   - Vérifier firewall

2. **Messages non reçus**
   - Vérifier abonnement aux topics
   - Vérifier QoS
   - Vérifier paramètres notifications

3. **Performance dégradée**
   - Augmenter keepAlive
   - Ajuster reconnectInterval
   - Vérifier charge serveur
