import 'package:flutter/foundation.dart'; // pour kIsWeb
import 'package:firebase_storage/firebase_storage.dart';
import 'package:image_picker/image_picker.dart';
import 'package:em2rp/services/data_service.dart';
import 'package:em2rp/services/api_service.dart';

class FirebaseStorageManager {
  FirebaseStorage get _storage => FirebaseStorage.instance;
  final DataService _dataService = DataService(apiService);

  /// Upload ou remplace la photo de profil d'un utilisateur dans Firebase Storage.
  /// Pour le Web, on fixe l'extension .jpg.
  /// 1. Construit le chemin : "ProfilePictures/UID.jpg"
  /// 2. Supprime l'ancienne photo (si elle existe).
  /// 3. Upload la nouvelle photo.
  /// 4. Met à jour Firestore avec l'URL de la nouvelle image via l'API.
  Future<String?> sendProfilePicture(
      {required XFile imageFile, required String uid}) async {
    try {
      const String fileExtension = '.jpg'; // Extension fixe pour le web
      final String fileName = '$uid$fileExtension';
      final String filePath = 'ProfilePictures/$fileName';
      final Reference storageRef = _storage.ref().child(filePath);

      // 2. Suppression de l'ancienne photo de profil (si elle existe)
      try {
        await _storage.ref().child(filePath).delete();
        print(
            "FirebaseStorageManager: Ancienne photo supprimée pour l'utilisateur $uid.");
      } on FirebaseException catch (e) {
        if (e.code == 'object-not-found') {
          print(
              "FirebaseStorageManager: Pas d'ancienne photo à supprimer pour l'utilisateur $uid.");
        } else {
          print(
              "FirebaseStorageManager: Erreur lors de la suppression pour l'utilisateur $uid: ${e.message}");
          return null;
        }
      }

      // 3. Upload de la nouvelle photo en fonction de la plateforme
      UploadTask uploadTask;
      if (kIsWeb) {
        // Pour le web, lire les bytes et utiliser putData()
        final bytes = await imageFile.readAsBytes();
        uploadTask = storageRef.putData(bytes);
      } else {
        // Pour mobile/desktop, utiliser un File (dart:io)
        // Sur mobile, image_picker fournit un path, mais on ne doit pas utiliser File sur le web
        final bytes = await imageFile.readAsBytes();
        uploadTask = storageRef.putData(bytes);
      }

      final TaskSnapshot snapshot = await uploadTask.whenComplete(() {});
      if (snapshot.state == TaskState.success) {
        // 4. Récupérer l'URL de téléchargement
        final String downloadUrl = await snapshot.ref.getDownloadURL();
        print(
            "FirebaseStorageManager: Nouvelle photo uploadée pour l'utilisateur $uid. URL: $downloadUrl");

        // 5. Mettre à jour via l'API (plus sécurisé)
        try {
          await _dataService.updateUser(uid, {'profilePhotoUrl': downloadUrl});
          print(
              "FirebaseStorageManager: Profil mis à jour via API pour l'utilisateur $uid.");
        } catch (apiError) {
          print(
              "FirebaseStorageManager: Erreur API pour l'utilisateur $uid: $apiError");
          return downloadUrl; // On retourne l'URL même si la mise à jour échoue
        }
        return downloadUrl;
      } else {
        print(
            "FirebaseStorageManager: Échec de l'upload pour l'utilisateur $uid. État: ${snapshot.state}");
        return null;
      }
    } on FirebaseException catch (storageError) {
      print(
          "FirebaseStorageManager: Erreur Firebase Storage pour l'utilisateur $uid: ${storageError.message}");
      return null;
    } catch (e) {
      print(
          "FirebaseStorageManager: Erreur inattendue pour l'utilisateur $uid: $e");
      return null;
    }
  }
}
