import 'package:em2rp/models/maintenance_model.dart';
import 'package:em2rp/services/api_service.dart';

class MaintenanceService {
  final ApiService _apiService = apiService;


  // ============================================================================
  // CRUD Operations - Utilise le backend sécurisé
  // ============================================================================

  /// Créer une nouvelle maintenance (via Cloud Function)
  Future<void> createMaintenance(MaintenanceModel maintenance) async {
    try {
      await _apiService.call('createMaintenance', maintenance.toMap());
      // Note: La Cloud Function gère maintenant la mise à jour des équipements et la création des alertes
    } catch (e) {
      print('Error creating maintenance: $e');
      rethrow;
    }
  }

  /// Mettre à jour une maintenance (via Cloud Function)
  Future<void> updateMaintenance(String id, Map<String, dynamic> data) async {
    try {
      await _apiService.call('updateMaintenance', {
        'maintenanceId': id,
        'data': data,
      });
    } catch (e) {
      print('Error updating maintenance: $e');
      rethrow;
    }
  }

  /// Supprimer une maintenance
  Future<void> deleteMaintenance(String id) async {
    try {
      await _apiService.call('deleteMaintenance', {
        'maintenanceId': id,
      });
      // Note: La Cloud Function gère la mise à jour des équipements
    } catch (e) {
      print('Error deleting maintenance: $e');
      rethrow;
    }
  }

  /// Récupérer une maintenance par ID
  Future<MaintenanceModel?> getMaintenanceById(String id) async {
    try {
      final response = await _apiService.call('getMaintenances', {
        'maintenanceId': id,
      });

      final maintenances = (response['maintenances'] as List?)
          ?.map((m) => MaintenanceModel.fromMap(m as Map<String, dynamic>, m['id'] as String))
          .toList();

      return maintenances?.firstWhere(
        (m) => m.id == id,
        orElse: () => throw Exception('Maintenance not found'),
      );
    } catch (e) {
      print('Error getting maintenance: $e');
      return null;
    }
  }

  /// Récupérer l'historique des maintenances pour un équipement
  Future<List<MaintenanceModel>> getMaintenancesByEquipment(String equipmentId) async {
    try {
      final response = await _apiService.call('getMaintenances', {
        'equipmentId': equipmentId,
      });

      final maintenances = (response['maintenances'] as List?)
          ?.map((m) => MaintenanceModel.fromMap(m as Map<String, dynamic>, m['id'] as String))
          .toList() ?? [];

      return maintenances;
    } catch (e) {
      print('Error getting maintenances: $e');
      rethrow;
    }
  }

  /// Récupérer toutes les maintenances
  Future<List<MaintenanceModel>> getAllMaintenances() async {
    try {
      final response = await _apiService.call('getMaintenances', {});

      final maintenances = (response['maintenances'] as List?)
          ?.map((m) => MaintenanceModel.fromMap(m as Map<String, dynamic>, m['id'] as String))
          .toList() ?? [];

      return maintenances;
    } catch (e) {
      print('Error getting all maintenances: $e');
      rethrow;
    }
  }

  /// Marquer une maintenance comme complétée
  Future<void> completeMaintenance(String id, {String? performedBy, double? cost}) async {
    try {
      await _apiService.call('completeMaintenance', {
        'maintenanceId': id,
        if (performedBy != null) 'performedBy': performedBy,
        if (cost != null) 'cost': cost,
      });
    } catch (e) {
      print('Error completing maintenance: $e');
      rethrow;
    }
  }

  /// Vérifier les maintenances à venir et créer des alertes
  Future<void> checkUpcomingMaintenances() async {
    try {
      await _apiService.call('checkUpcomingMaintenances', {});
    } catch (e) {
      print('Error checking upcoming maintenances: $e');
      rethrow;
    }
  }
}
