/// Calcule le temps écoulé depuis une date donnée.
///
/// Cette fonction retourne une représentation lisible du temps écoulé
/// depuis la date spécifiée jusqu'à maintenant.
///
/// **Usage:**
/// ```dart
/// final timeAgo = calculateTimeAgo(DateTime.now().subtract(Duration(hours: 2)));
/// // Résultat: "il y a 2 heures"
/// ```
///
/// [publicationDate] La date de référence
///
/// Returns une chaîne décrivant le temps écoulé.
///
/// **Exemples:**
/// - "À l'instant" si moins d'une minute
/// - "il y a 5 minutes" si moins d'une heure
/// - "il y a 2 heures" si moins d'un jour
/// - "il y a 3 jours" si moins d'une semaine
/// - "il y a 2 semaines" si moins d'un mois
/// - "il y a 3 mois" si moins d'un an
/// - "il y a 2 ans" si plus d'un an
String calculateTimeAgo(DateTime publicationDate) {
  final now = DateTime.now();
  final difference = now.difference(publicationDate);

  // Si la date est dans le futur, retourner "dans X"
  if (difference.isNegative) {
    final futureDiff = publicationDate.difference(now);
    if (futureDiff.inDays > 365) {
      final years = (futureDiff.inDays / 365).floor();
      return 'dans $years an${years > 1 ? 's' : ''}';
    } else if (futureDiff.inDays > 30) {
      final months = (futureDiff.inDays / 30).floor();
      return 'dans $months mois';
    } else if (futureDiff.inDays > 7) {
      final weeks = (futureDiff.inDays / 7).floor();
      return 'dans $weeks semaine${weeks > 1 ? 's' : ''}';
    } else if (futureDiff.inDays > 0) {
      return 'dans ${futureDiff.inDays} jour${futureDiff.inDays > 1 ? 's' : ''}';
    } else if (futureDiff.inHours > 0) {
      return 'dans ${futureDiff.inHours} heure${futureDiff.inHours > 1 ? 's' : ''}';
    } else if (futureDiff.inMinutes > 0) {
      return 'dans ${futureDiff.inMinutes} minute${futureDiff.inMinutes > 1 ? 's' : ''}';
    } else {
      return 'maintenant';
    }
  }

  // Calcul pour le passé
  if (difference.inDays > 365) {
    final years = (difference.inDays / 365).floor();
    return 'il y a $years an${years > 1 ? 's' : ''}';
  } else if (difference.inDays > 30) {
    final months = (difference.inDays / 30).floor();
    return 'il y a $months mois';
  } else if (difference.inDays > 7) {
    final weeks = (difference.inDays / 7).floor();
    return 'il y a $weeks semaine${weeks > 1 ? 's' : ''}';
  } else if (difference.inDays > 0) {
    return 'il y a ${difference.inDays} jour${difference.inDays > 1 ? 's' : ''}';
  } else if (difference.inHours > 0) {
    return 'il y a ${difference.inHours} heure${difference.inHours > 1 ? 's' : ''}';
  } else if (difference.inMinutes > 0) {
    return 'il y a ${difference.inMinutes} minute${difference.inMinutes > 1 ? 's' : ''}';
  } else {
    return 'À l\'instant';
  }
}

/// Calcule le temps écoulé avec un format plus détaillé.
///
/// Cette fonction retourne une représentation plus précise du temps écoulé,
/// incluant les secondes si nécessaire.
///
/// **Usage:**
/// ```dart
/// final timeAgo = calculateTimeAgoDetailed(DateTime.now().subtract(Duration(seconds: 30)));
/// // Résultat: "il y a 30 secondes"
/// ```
///
/// [publicationDate] La date de référence
///
/// Returns une chaîne décrivant le temps écoulé avec plus de détails.
String calculateTimeAgoDetailed(DateTime publicationDate) {
  final now = DateTime.now();
  final difference = now.difference(publicationDate);

  if (difference.isNegative) {
    return 'dans le futur';
  }

  if (difference.inDays > 0) {
    return 'il y a ${difference.inDays} jour${difference.inDays > 1 ? 's' : ''}';
  } else if (difference.inHours > 0) {
    return 'il y a ${difference.inHours} heure${difference.inHours > 1 ? 's' : ''}';
  } else if (difference.inMinutes > 0) {
    return 'il y a ${difference.inMinutes} minute${difference.inMinutes > 1 ? 's' : ''}';
  } else if (difference.inSeconds > 0) {
    return 'il y a ${difference.inSeconds} seconde${difference.inSeconds > 1 ? 's' : ''}';
  } else {
    return 'À l\'instant';
  }
}
