package com.quickblox.q_municate_db.managers;
import com.j256.ormlite.dao.Dao;
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.DialogNotification;
import com.quickblox.q_municate_db.models.DialogOccupant;
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 DialogNotificationDataManager extends BaseManager<DialogNotification> {
private static final String TAG = DialogNotificationDataManager.class.getSimpleName();
private Dao<Dialog, Long> dialogDao;
private Dao<DialogOccupant, Long> dialogOccupantDao;
public DialogNotificationDataManager(Dao<DialogNotification, Long> dialogNotificationDao,
Dao<Dialog, Long> dialogDao, Dao<DialogOccupant, Long> dialogOccupantDao) {
super(dialogNotificationDao, DialogNotificationDataManager.class.getSimpleName());
this.dialogDao = dialogDao;
this.dialogOccupantDao = dialogOccupantDao;
}
public List<DialogNotification> getDialogNotificationsByDialogId(String dialogId) {
List<DialogNotification> dialogNotificationsList = new ArrayList<>();
try {
QueryBuilder<DialogNotification, 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<DialogNotification> preparedQuery = messageQueryBuilder.prepare();
dialogNotificationsList = dao.query(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return dialogNotificationsList;
}
public DialogNotification getLastDialogNotificationByDialogId(List<Long> dialogOccupantsList) {
DialogNotification dialogNotification = null;
try {
QueryBuilder<DialogNotification, Long> queryBuilder = dao.queryBuilder();
Where<DialogNotification, Long> where = queryBuilder.where();
where.in(DialogOccupant.Column.ID, dialogOccupantsList);
queryBuilder.orderBy(DialogNotification.Column.CREATED_DATE, false);
PreparedQuery<DialogNotification> preparedQuery = queryBuilder.prepare();
dialogNotification = dao.queryForFirst(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return dialogNotification;
}
public DialogNotification getDialogNotificationByDialogId(boolean firstMessage, List<Long> dialogOccupantsList) {
DialogNotification dialogNotification = null;
try {
QueryBuilder<DialogNotification, Long> queryBuilder = dao.queryBuilder();
Where<DialogNotification, Long> where = queryBuilder.where();
where.and(
where.in(DialogOccupant.Column.ID, dialogOccupantsList),
where.eq(DialogNotification.Column.STATE, State.READ)
);
queryBuilder.orderBy(DialogNotification.Column.CREATED_DATE, firstMessage);
PreparedQuery<DialogNotification> preparedQuery = queryBuilder.prepare();
dialogNotification = dao.queryForFirst(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return dialogNotification;
}
public long getCountUnreadDialogNotifications(List<Long> dialogOccupantsIdsList, int currentUserId) {
long count = 0;
try {
QueryBuilder<DialogNotification, Long> queryBuilder = dao.queryBuilder();
queryBuilder.setCountOf(true);
QueryBuilder<DialogOccupant, Long> dialogOccupantQueryBuilder = dialogOccupantDao.queryBuilder();
dialogOccupantQueryBuilder.where().ne(User.Column.ID, currentUserId);
queryBuilder.join(dialogOccupantQueryBuilder);
Where<DialogNotification, Long> where = queryBuilder.where();
where.and(
where.in(DialogOccupant.Column.ID, dialogOccupantsIdsList),
where.or(
where.eq(DialogNotification.Column.STATE, State.DELIVERED),
where.eq(DialogNotification.Column.STATE, State.TEMP_LOCAL_UNREAD)
)
);
PreparedQuery<DialogNotification> preparedQuery = queryBuilder.prepare();
count = dao.countOf(preparedQuery);
} catch (SQLException e) {
ErrorUtils.logError(e);
}
return count;
}
}