package com.quickblox.q_municate_db.managers;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.stmt.PreparedQuery;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.quickblox.q_municate_db.managers.base.BaseManager;
import com.quickblox.q_municate_db.models.Dialog;
import com.quickblox.q_municate_db.models.DialogOccupant;
import com.quickblox.q_municate_db.models.Message;
import com.quickblox.q_municate_db.models.State;
import com.quickblox.q_municate_db.models.User;
import com.quickblox.q_municate_db.utils.ErrorUtils;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MessageDataManager extends BaseManager<Message> {
private static final String TAG = MessageDataManager.class.getSimpleName();
private Dao<Dialog, Long> dialogDao;
private Dao<DialogOccupant, Long> dialogOccupantDao;
public MessageDataManager(Dao<Message, Long> messageDao, Dao<Dialog, Long> dialogDao,
Dao<DialogOccupant, Long> dialogOccupantDao) {
super(messageDao, MessageDataManager.class.getSimpleName());
this.dialogDao = dialogDao;
this.dialogOccupantDao = dialogOccupantDao;
}
public Message getByMessageId(String messageId) {
Message message = null;
try {
QueryBuilder<Message, Long> messageQueryBuilder = dao.queryBuilder();
messageQueryBuilder.where().eq(Message.Column.ID, messageId);
PreparedQuery<Message> preparedQuery = messageQueryBuilder.prepare();
message = dao.queryForFirst(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return message;
}
public Message getLastMessageWithTempByDialogId(List<Long> dialogOccupantsList) {
Message message = null;
try {
QueryBuilder<Message, Long> queryBuilder = dao.queryBuilder();
queryBuilder.where().in(DialogOccupant.Column.ID, dialogOccupantsList);
queryBuilder.orderBy(Message.Column.CREATED_DATE, false);
PreparedQuery<Message> preparedQuery = queryBuilder.prepare();
message = dao.queryForFirst(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return message;
}
public Message getMessageByDialogId(boolean firstMessage, List<Long> dialogOccupantsList) {
Message message = null;
try {
QueryBuilder<Message, Long> queryBuilder = dao.queryBuilder();
Where<Message, Long> where = queryBuilder.where();
where.and(
where.in(DialogOccupant.Column.ID, dialogOccupantsList),
where.eq(Message.Column.STATE, State.READ)
);
queryBuilder.orderBy(Message.Column.CREATED_DATE, firstMessage);
PreparedQuery<Message> preparedQuery = queryBuilder.prepare();
message = dao.queryForFirst(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return message;
}
public long getCountUnreadMessages(List<Long> dialogOccupantsIdsList, int currentUserId) {
long count = 0;
try {
QueryBuilder<Message, Long> queryBuilder = dao.queryBuilder();
queryBuilder.setCountOf(true);
QueryBuilder<DialogOccupant, Long> dialogOccupantQueryBuilder = dialogOccupantDao.queryBuilder();
dialogOccupantQueryBuilder.where().ne(User.Column.ID, currentUserId);
queryBuilder.join(dialogOccupantQueryBuilder);
Where<Message, Long> where = queryBuilder.where();
where.and(
where.in(DialogOccupant.Column.ID, dialogOccupantsIdsList),
where.or(
where.eq(Message.Column.STATE, State.DELIVERED),
where.eq(Message.Column.STATE, State.TEMP_LOCAL_UNREAD)
)
);
PreparedQuery<Message> preparedQuery = queryBuilder.prepare();
count = dao.countOf(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return count;
}
public Message getLastMessageByDialogId(List<Long> dialogOccupantsList) {
Message message = null;
try {
QueryBuilder<Message, Long> queryBuilder = dao.queryBuilder();
Where<Message, Long> where = queryBuilder.where();
where.in(DialogOccupant.Column.ID, dialogOccupantsList);
queryBuilder.orderBy(Message.Column.CREATED_DATE, false);
PreparedQuery<Message> preparedQuery = queryBuilder.prepare();
message = dao.queryForFirst(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return message;
}
public List<Message> getMessagesByDialogId(String dialogId) {
List<Message> messagesList = new ArrayList<>();
try {
QueryBuilder<Message, Long> messageQueryBuilder = dao.queryBuilder();
QueryBuilder<DialogOccupant, Long> dialogOccupantQueryBuilder = dialogOccupantDao.queryBuilder();
QueryBuilder<Dialog, Long> dialogQueryBuilder = dialogDao.queryBuilder();
dialogQueryBuilder.where().eq(Dialog.Column.ID, dialogId);
dialogOccupantQueryBuilder.join(dialogQueryBuilder);
messageQueryBuilder.join(dialogOccupantQueryBuilder);
PreparedQuery<Message> preparedQuery = messageQueryBuilder.prepare();
messagesList = dao.query(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return messagesList;
}
public void deleteTempMessages(List<Long> dialogOccupantsIdsList) {
try {
DeleteBuilder<Message, Long> deleteBuilder = dao.deleteBuilder();
Where<Message, Long> where = deleteBuilder.where();
where.and(
where.in(DialogOccupant.Column.ID, dialogOccupantsIdsList),
where.or(
where.eq(Message.Column.STATE, State.TEMP_LOCAL),
where.eq(Message.Column.STATE, State.TEMP_LOCAL_UNREAD)
)
);
deleteBuilder.delete();
} catch (SQLException e) {
ErrorUtils.logError(e);
}
notifyObservers(OBSERVE_KEY);
}
public List<Message> getTempMessagesByDialogId(String dialogId){
List<Message> messagesList = new ArrayList<>();
try {
QueryBuilder<Message, Long> messageQueryBuilder = dao.queryBuilder();
QueryBuilder<DialogOccupant, Long> dialogOccupantQueryBuilder = dialogOccupantDao.queryBuilder();
QueryBuilder<Dialog, Long> dialogQueryBuilder = dialogDao.queryBuilder();
dialogQueryBuilder.where().eq(Dialog.Column.ID, dialogId);
dialogOccupantQueryBuilder.join(dialogQueryBuilder);
messageQueryBuilder.join(dialogOccupantQueryBuilder);
Where<Message, Long> where = messageQueryBuilder.where();
where.or(where.eq(Message.Column.STATE, State.TEMP_LOCAL),
where.eq(Message.Column.STATE, State.TEMP_LOCAL_UNREAD));
PreparedQuery<Message> preparedQuery = messageQueryBuilder.prepare();
messagesList = dao.query(preparedQuery);
} catch (SQLException e) {
e.printStackTrace();
}
return messagesList;
}
}