import '../../domain/entities/social_post.dart';

/// Modèle de données pour les posts sociaux (Data Transfer Object).
///
/// Cette classe est responsable de la sérialisation/désérialisation
/// avec l'API backend et convertit vers/depuis l'entité de domaine SocialPost.
class SocialPostModel {
  SocialPostModel({
    required this.id,
    required this.content,
    required this.userId,
    required this.userFirstName,
    required this.userLastName,
    required this.userProfileImageUrl,
    required this.timestamp,
    this.imageUrl,
    this.likesCount = 0,
    this.commentsCount = 0,
    this.sharesCount = 0,
    this.isLikedByCurrentUser = false,
  });

  /// Factory pour créer un [SocialPostModel] à partir d'un JSON.
  factory SocialPostModel.fromJson(Map<String, dynamic> json) {
    return SocialPostModel(
      id: _parseId(json, 'id', ''),
      content: _parseString(json, 'content', ''),
      userId: _parseId(json, 'userId', ''),
      userFirstName: _parseString(json, 'userFirstName', ''),
      userLastName: _parseString(json, 'userLastName', ''),
      userProfileImageUrl: _parseString(json, 'userProfileImageUrl', ''),
      timestamp: _parseTimestamp(json['timestamp']),
      imageUrl: json['imageUrl'] as String?,
      likesCount: _parseInt(json, 'likesCount'),
      commentsCount: _parseInt(json, 'commentsCount'),
      sharesCount: _parseInt(json, 'sharesCount'),
      isLikedByCurrentUser: json['isLikedByCurrentUser'] as bool? ?? false,
    );
  }

  /// Crée un [SocialPostModel] depuis une entité de domaine [SocialPost].
  factory SocialPostModel.fromEntity(SocialPost post) {
    return SocialPostModel(
      id: post.id,
      content: post.content,
      userId: post.userId,
      userFirstName: post.userFirstName,
      userLastName: post.userLastName,
      userProfileImageUrl: post.userProfileImageUrl,
      timestamp: post.timestamp,
      imageUrl: post.imageUrl,
      likesCount: post.likesCount,
      commentsCount: post.commentsCount,
      sharesCount: post.sharesCount,
      isLikedByCurrentUser: post.isLikedByCurrentUser,
    );
  }

  final String id;
  final String content;
  final String userId;
  final String userFirstName;
  final String userLastName;
  final String userProfileImageUrl;
  final DateTime timestamp;
  final String? imageUrl;
  final int likesCount;
  final int commentsCount;
  final int sharesCount;
  final bool isLikedByCurrentUser;

  /// Convertit ce modèle en JSON pour l'envoi vers l'API.
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'content': content,
      'userId': userId,
      'userFirstName': userFirstName,
      'userLastName': userLastName,
      'userProfileImageUrl': userProfileImageUrl,
      'timestamp': timestamp.toIso8601String(),
      if (imageUrl != null) 'imageUrl': imageUrl,
      'likesCount': likesCount,
      'commentsCount': commentsCount,
      'sharesCount': sharesCount,
      'isLikedByCurrentUser': isLikedByCurrentUser,
    };
  }

  /// Convertit ce modèle vers une entité de domaine [SocialPost].
  SocialPost toEntity() {
    return SocialPost(
      id: id,
      content: content,
      userId: userId,
      userFirstName: userFirstName,
      userLastName: userLastName,
      userProfileImageUrl: userProfileImageUrl,
      timestamp: timestamp,
      imageUrl: imageUrl,
      likesCount: likesCount,
      commentsCount: commentsCount,
      sharesCount: sharesCount,
      isLikedByCurrentUser: isLikedByCurrentUser,
    );
  }

  /// Parse une valeur string depuis le JSON avec valeur par défaut.
  static String _parseString(
    Map<String, dynamic> json,
    String key,
    String defaultValue,
  ) {
    return json[key] as String? ?? defaultValue;
  }

  /// Parse une valeur int depuis le JSON avec valeur par défaut 0.
  static int _parseInt(Map<String, dynamic> json, String key) {
    return json[key] as int? ?? 0;
  }

  /// Parse un timestamp depuis le JSON.
  static DateTime _parseTimestamp(dynamic timestamp) {
    if (timestamp == null) return DateTime.now();

    if (timestamp is String) {
      try {
        return DateTime.parse(timestamp);
      } catch (e) {
        return DateTime.now();
      }
    }

    if (timestamp is int) {
      return DateTime.fromMillisecondsSinceEpoch(timestamp);
    }

    return DateTime.now();
  }

  /// Parse un ID (UUID) depuis le JSON.
  ///
  /// [json] Le JSON à parser
  /// [key] La clé de l'ID
  /// [defaultValue] La valeur par défaut si l'ID est null
  ///
  /// Returns l'ID parsé ou la valeur par défaut
  static String _parseId(Map<String, dynamic> json, String key, String defaultValue) {
    final value = json[key];
    if (value == null) return defaultValue;
    return value.toString();
  }
}
