/// Modèles de données Conversation v4 avec désérialisation JSON
library conversation_model;

import '../../domain/entities/conversation.dart';
import 'message_model.dart';

/// Modèle de résumé de conversation (liste)
class ConversationSummaryModel extends ConversationSummary {
  const ConversationSummaryModel({
    required super.id,
    required super.typeConversation,
    required super.titre,
    required super.statut,
    super.dernierMessageApercu,
    super.dernierMessageType,
    super.dernierMessageAt,
    super.nonLus,
    super.organisationId,
  });

  factory ConversationSummaryModel.fromJson(Map<String, dynamic> json) {
    return ConversationSummaryModel(
      id: json['id']?.toString() ?? '',
      typeConversation: json['typeConversation']?.toString() ?? 'DIRECTE',
      titre: json['titre']?.toString() ?? '',
      statut: json['statut']?.toString() ?? 'ACTIVE',
      dernierMessageApercu: json['dernierMessageApercu']?.toString(),
      dernierMessageType: json['dernierMessageType']?.toString(),
      dernierMessageAt: json['dernierMessageAt'] != null
          ? DateTime.tryParse(json['dernierMessageAt'].toString())
          : null,
      nonLus: _parseInt(json['nonLus']),
      organisationId: json['organisationId']?.toString(),
    );
  }
}

/// Modèle de participant
class ConversationParticipantModel extends ConversationParticipant {
  const ConversationParticipantModel({
    required super.membreId,
    super.prenom,
    super.nom,
    super.roleDansConversation,
    super.luJusqua,
  });

  factory ConversationParticipantModel.fromJson(Map<String, dynamic> json) {
    return ConversationParticipantModel(
      membreId: json['membreId']?.toString() ?? '',
      prenom: json['prenom']?.toString(),
      nom: json['nom']?.toString(),
      roleDansConversation: json['roleDansConversation']?.toString(),
      luJusqua: json['luJusqua'] != null
          ? DateTime.tryParse(json['luJusqua'].toString())
          : null,
    );
  }
}

/// Modèle de conversation complète (détail)
class ConversationModel extends Conversation {
  const ConversationModel({
    required super.id,
    required super.typeConversation,
    required super.titre,
    required super.statut,
    super.organisationId,
    super.organisationNom,
    super.dateCreation,
    super.nombreMessages,
    super.participants,
    super.messages,
    super.nonLus,
    super.roleCible,
  });

  factory ConversationModel.fromJson(Map<String, dynamic> json) {
    final participantsJson = json['participants'] as List<dynamic>? ?? [];
    final messagesJson = json['messages'] as List<dynamic>? ?? [];

    return ConversationModel(
      id: json['id']?.toString() ?? '',
      typeConversation: json['typeConversation']?.toString() ?? 'DIRECTE',
      titre: json['titre']?.toString() ?? '',
      statut: json['statut']?.toString() ?? 'ACTIVE',
      organisationId: json['organisationId']?.toString(),
      organisationNom: json['organisationNom']?.toString(),
      dateCreation: json['dateCreation'] != null
          ? DateTime.tryParse(json['dateCreation'].toString())
          : null,
      nombreMessages: _parseInt(json['nombreMessages']),
      participants: participantsJson
          .map((p) => ConversationParticipantModel.fromJson(p as Map<String, dynamic>))
          .toList(),
      messages: messagesJson
          .map((m) => MessageModel.fromJson(m as Map<String, dynamic>))
          .toList(),
      nonLus: _parseInt(json['nonLus']),
      roleCible: json['roleCible']?.toString(),
    );
  }
}

int _parseInt(dynamic value) {
  if (value == null) return 0;
  if (value is int) return value;
  if (value is double) return value.toInt();
  return int.tryParse(value.toString()) ?? 0;
}
