import 'dart:collection';

import 'package:comunic/helpers/serialization/base_serialization_helper.dart';
import 'package:comunic/lists/conversation_messages_list.dart';
import 'package:comunic/models/conversation_message.dart';

/// Conversations serialization helper
///
/// @author Pierre Hubert

HashMap<int, ConversationsMessagesSerializationHelper> _instances;

class ConversationsMessagesSerializationHelper
    extends BaseSerializationHelper<ConversationMessage> {
  final int convID;

  ConversationsMessagesSerializationHelper._(int convID)
      : convID = convID,
        assert(convID != null);

  factory ConversationsMessagesSerializationHelper(int convID) {
    if (_instances == null) _instances = HashMap();

    if (!_instances.containsKey(convID))
      _instances[convID] = ConversationsMessagesSerializationHelper._(convID);

    return _instances[convID];
  }

  @override
  ConversationMessage parse(Map<String, dynamic> m) =>
      ConversationMessage.fromJson(m);

  @override
  String get type => "conv-messages-$convID";

  Future<ConversationMessagesList> getList() async =>
      ConversationMessagesList()..addAll(await super.getList());

  Future<void> insertOrReplace(ConversationMessage msg) async =>
      await insertOrReplaceElement((t) => t.id == msg.id, msg);

  Future<void> remove(ConversationMessage msg) async =>
      await removeElement((t) => t.id == msg.id);

  /// Insert or replace a list of messages
  Future<void> insertOrReplaceAll(List<ConversationMessage> list) async {
    for (var message in list)
      await insertOrReplaceElement((t) => t.id == message.id, message);
  }
}