# 🔔 Что еще нужно для полной интеграции FCM (Push-уведомления)

## ✅ Уже реализовано

1. **Android клиент:**

   - ✅ Firebase SDK добавлен в dependencies
   - ✅ `RosettaFirebaseMessagingService` - обработка уведомлений
   - ✅ `MainActivity` - инициализация Firebase и отправка токена
   - ✅ Packet `PacketPushToken` (0x0A) для отправки токена на сервер
   - ✅ Разрешения `POST_NOTIFICATIONS` в AndroidManifest
   - ✅ Сервис зарегистрирован в манифесте

2. **Документация:**
   - ✅ `FCM_SETUP.md` с полной архитектурой и примерами
   - ✅ `google-services.json.example` - пример конфига

## ⚠️ Нужно сделать

### 1. Firebase Console Setup

1. **Получить google-services.json:**

   ```bash
   # 1. Зайти на https://console.firebase.google.com/
   # 2. Создать/выбрать проект
   # 3. Добавить Android приложение
   # 4. Указать package name: com.rosetta.messenger
   # 5. Скачать google-services.json
   # 6. Положить в rosetta-android/app/
   ```

2. **Важно:** Файл `google-services.json` должен быть в gitignore (уже есть пример .example)

### 2. Серверная часть

Нужно реализовать на сервере:

#### 2.1 Обработка PacketPushToken (0x0A)

```kotlin
// Сервер должен сохранить FCM токен для пользователя
when (packetType) {
    0x0A -> { // PacketPushToken
        val pushToken = PacketPushToken.deserialize(stream)

        // Сохранить в базе данных:
        // user_fcm_tokens:
        //   - public_key (primary key)
        //   - fcm_token (string)
        //   - platform ("android")
        //   - updated_at (timestamp)

        saveFcmToken(
            publicKey = pushToken.publicKey,
            fcmToken = pushToken.pushToken,
            platform = pushToken.platform
        )
    }
}
```

#### 2.2 Отправка Push-уведомлений

Когда приходит новое сообщение для пользователя:

```kotlin
// Псевдокод для сервера
fun onNewMessage(toPublicKey: String, fromPublicKey: String, message: String) {
    // 1. Получить FCM токен получателя
    val fcmToken = getFcmToken(toPublicKey) ?: return

    // 2. Отправить уведомление через Firebase Admin SDK
    val notification = Message.builder()
        .setToken(fcmToken)
        .setNotification(
            Notification.builder()
                .setTitle(getSenderName(fromPublicKey))
                .setBody(message)
                .build()
        )
        .putData("sender_public_key", fromPublicKey)
        .putData("message", message)
        .build()

    FirebaseMessaging.getInstance().send(notification)
}
```

#### 2.3 Firebase Admin SDK (Node.js пример)

```javascript
// На сервере установить:
// npm install firebase-admin

const admin = require("firebase-admin");
const serviceAccount = require("./serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

async function sendPushNotification(fcmToken, senderName, messageText) {
  const message = {
    token: fcmToken,
    notification: {
      title: senderName,
      body: messageText,
    },
    data: {
      sender_public_key: senderPublicKey,
      message: messageText,
    },
    android: {
      priority: "high",
      notification: {
        sound: "default",
        channelId: "rosetta_messages",
      },
    },
  };

  try {
    const response = await admin.messaging().send(message);
    console.log("✅ Push sent:", response);
  } catch (error) {
    console.error("❌ Push failed:", error);
  }
}
```

### 3. Тестирование

#### 3.1 Проверка получения токена

```bash
# После запуска приложения проверить в logcat:
adb logcat -s RosettaFCM
# Должно быть: 🔔 FCM token: ...
```

#### 3.2 Отправка тестового уведомления

Через Firebase Console:

1. Зайти в Firebase Console → Cloud Messaging
2. Создать тестовое уведомление
3. Указать FCM token из logcat
4. Отправить

#### 3.3 Проверка работы сервера

1. Запустить приложение
2. Убедиться что `PacketPushToken` отправился на сервер (логи протокола)
3. Отправить сообщение с другого аккаунта
4. Проверить что пришло push-уведомление

### 4. Оптимизации (опционально)

1. **Обработка обновления токена:**

   - FCM токен может меняться
   - `onNewToken()` в `RosettaFirebaseMessagingService` уже обрабатывает это
   - Сервер должен обновлять токен в БД

2. **Разные типы уведомлений:**

   ```kotlin
   // Можно добавить в PacketPushToken поле notification_settings
   data class NotificationSettings(
       val showPreview: Boolean = true,  // Показывать текст сообщения
       val vibrate: Boolean = true,
       val sound: Boolean = true
   )
   ```

3. **Проверка валидности токена:**
   - Сервер может проверять что токен валиден через Firebase Admin API
   - Удалять невалидные токены из БД

## 📝 Чеклист готовности

- [x] Android: Firebase SDK добавлен
- [x] Android: FCM Service создан
- [x] Android: PacketPushToken добавлен
- [x] Android: MainActivity отправляет токен
- [ ] **Firebase: google-services.json получен и добавлен**
- [ ] **Сервер: Обработка PacketPushToken**
- [ ] **Сервер: Firebase Admin SDK настроен**
- [ ] **Сервер: Отправка push при новых сообщениях**
- [ ] Тестирование: Получение токена работает
- [ ] Тестирование: Push-уведомления приходят

## 🚀 Следующий шаг

**Сейчас нужно:**

1. Получить `google-services.json` из Firebase Console
2. Добавить его в `rosetta-android/app/google-services.json`
3. Реализовать серверную часть (обработка PacketPushToken + отправка push)
4. Протестировать end-to-end

## 📚 Полезные ссылки

- [FCM Android Setup](https://firebase.google.com/docs/cloud-messaging/android/client)
- [Firebase Admin SDK](https://firebase.google.com/docs/admin/setup)
- [FCM Server Protocols](https://firebase.google.com/docs/cloud-messaging/server)
