package com.quickblox.sample.chat.utils.qb;
import com.quickblox.chat.model.QBChatDialog;
import com.quickblox.chat.model.QBChatMessage;
import com.quickblox.chat.model.QBDialogType;
import com.quickblox.users.model.QBUser;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class QbDialogHolder {
private static QbDialogHolder instance;
private Map<String, QBChatDialog> dialogsMap;
public static synchronized QbDialogHolder getInstance() {
if (instance == null) {
instance = new QbDialogHolder();
}
return instance;
}
private QbDialogHolder() {
dialogsMap = new TreeMap<>();
}
public Map<String, QBChatDialog> getDialogs() {
return getSortedMap(dialogsMap);
}
public QBChatDialog getChatDialogById(String dialogId){
return dialogsMap.get(dialogId);
}
public void clear() {
dialogsMap.clear();
}
public void addDialog(QBChatDialog dialog) {
if (dialog != null) {
dialogsMap.put(dialog.getDialogId(), dialog);
}
}
public void addDialogs(List<QBChatDialog> dialogs) {
for (QBChatDialog dialog : dialogs) {
addDialog(dialog);
}
}
public void deleteDialogs(Collection<QBChatDialog> dialogs) {
for (QBChatDialog dialog : dialogs) {
deleteDialog(dialog);
}
}
public void deleteDialogs(ArrayList<String> dialogsIds) {
for (String dialogId : dialogsIds) {
deleteDialog(dialogId);
}
}
public void deleteDialog(QBChatDialog chatDialog){
dialogsMap.remove(chatDialog.getDialogId());
}
public void deleteDialog(String dialogId){
dialogsMap.remove(dialogId);
}
public boolean hasDialogWithId(String dialogId){
return dialogsMap.containsKey(dialogId);
}
public boolean hasPrivateDialogWithUser(QBUser user){
return getPrivateDialogWithUser(user) != null;
}
public QBChatDialog getPrivateDialogWithUser(QBUser user){
for (QBChatDialog chatDialog : dialogsMap.values()){
if (QBDialogType.PRIVATE.equals(chatDialog.getType())
&& chatDialog.getOccupants().contains(user.getId())){
return chatDialog;
}
}
return null;
}
private Map<String, QBChatDialog> getSortedMap(Map <String, QBChatDialog> unsortedMap){
Map <String, QBChatDialog> sortedMap = new TreeMap(new LastMessageDateSentComparator(unsortedMap));
sortedMap.putAll(unsortedMap);
return sortedMap;
}
public void updateDialog(String dialogId, QBChatMessage qbChatMessage){
QBChatDialog updatedDialog = getChatDialogById(dialogId);
updatedDialog.setLastMessage(qbChatMessage.getBody());
updatedDialog.setLastMessageDateSent(qbChatMessage.getDateSent());
updatedDialog.setUnreadMessageCount(updatedDialog.getUnreadMessageCount() != null
? updatedDialog.getUnreadMessageCount() + 1 : 1);
updatedDialog.setLastMessageUserId(qbChatMessage.getSenderId());
dialogsMap.put(updatedDialog.getDialogId(), updatedDialog);
}
static class LastMessageDateSentComparator implements Comparator<String> {
Map <String, QBChatDialog> map;
public LastMessageDateSentComparator(Map <String, QBChatDialog> map) {
this.map = map;
}
public int compare(String keyA, String keyB) {
long valueA = map.get(keyA).getLastMessageDateSent();
long valueB = map.get(keyB).getLastMessageDateSent();
if (valueB < valueA){
return -1;
} else {
return 1;
}
}
}
}