# Plan - Suivi du statut de génération Suno

## Objectif
Permettre de suivre la progression d'une génération de musique Suno en utilisant le taskId retourné par l'API.

## Problème identifié
- ✅ L'API Suno retourne un taskId après la génération
- ✅ Pas de moyen de suivre la progression de la génération
- ✅ Besoin d'une fonction pour interroger le statut

## Solution implémentée

### ✅ 1. Ajout de la constante API
- [x] Ajouté `SUNO_STATUS_PATH = "/api/v1/query"` dans `music.js`
- [x] Endpoint pour interroger le statut d'une tâche

### ✅ 2. Création de la fonction getSunoStatus
- [x] Nouvelle fonction Cloud Function `getSunoStatus`
- [x] Prend en paramètre le `taskId`
- [x] Interroge l'API Suno pour récupérer le statut
- [x] Retourne les données de progression

### ✅ 3. Export de la fonction
- [x] Ajouté l'export dans `index.js`
- [x] Fonction accessible via `firebase.functions().httpsCallable('getSunoStatus')`

## Structure de la fonction

```javascript
exports.getSunoStatus = onCall({}, async ({ data = {} }) => {
  const { taskId } = data;
  
  // Validation du taskId
  // Appel à l'API Suno
  // Parsing de la réponse
  // Retour des données
});
```

## Utilisation côté client

```javascript
// Après avoir généré la musique et récupéré le taskId
const checkStatus = async (taskId) => {
  try {
    const result = await firebase
      .functions()
      .httpsCallable('getSunoStatus')({ taskId });
    
    console.log('Statut:', result.data);
    return result.data;
  } catch (error) {
    console.error('Erreur:', error);
  }
};

// Polling pour suivre la progression
const pollStatus = async (taskId) => {
  const interval = setInterval(async () => {
    const status = await checkStatus(taskId);
    
    if (status?.data?.status === 'completed') {
      clearInterval(interval);
      console.log('🎵 Génération terminée!');
    }
  }, 5000); // Vérifier toutes les 5 secondes
};
```

## Réponse de la fonction

### Succès
```json
{
  "success": true,
  "taskId": "aa6920a5a84317c40688b6c4e457c630",
  "data": {
    "status": "processing", // ou "completed", "failed"
    "progress": 75,
    "audio_url": "https://...",
    "video_url": "https://...",
    "image_url": "https://..."
  }
}
```

### Erreur
```json
{
  "error": "Erreur lors de la vérification du statut: TaskId manquant"
}
```

## Statuts possibles

- `pending` : En attente de traitement
- `processing` : En cours de génération
- `completed` : Génération terminée avec succès
- `failed` : Échec de la génération
- `cancelled` : Génération annulée

## Gestion des erreurs

- ✅ Validation du taskId obligatoire
- ✅ Gestion des erreurs de réseau
- ✅ Parsing sécurisé de la réponse JSON
- ✅ Logs avec émojis pour le debugging
- ✅ Messages d'erreur explicites

## Prochaines étapes

- [ ] Déployer les fonctions : `firebase deploy --only functions`
- [ ] Tester la fonction avec un taskId réel
- [ ] Implémenter le polling côté client
- [ ] Ajouter une interface utilisateur pour afficher la progression
- [ ] Gérer les cas d'erreur côté client

## Exemple d'intégration complète

```javascript
// 1. Générer la musique
const generateResult = await firebase
  .functions()
  .httpsCallable('music-generateMusic')(musicData);

const taskId = generateResult.data.response.data.taskId;

// 2. Suivre la progression
if (taskId) {
  pollStatus(taskId);
} else {
  console.error('❌ TaskId manquant');
}
```

## Notes importantes

- ⚠️ Ne pas interroger l'API trop fréquemment (max toutes les 5 secondes)
- ⚠️ Implémenter un timeout pour éviter les boucles infinies
- ⚠️ Gérer les cas où le taskId n'existe plus
- ⚠️ La génération peut prendre 2-3 minutes selon la complexité

## Fichiers modifiés

- ✅ `/functions/src/music.js` - Ajout de getSunoStatus
- ✅ `/functions/index.js` - Export de la fonction
- ✅ `/plans/suno-status-tracking.md` - Ce fichier de documentation