package com.fastaccess.ui.modules.notification.all;
import android.support.annotation.NonNull;
import android.view.View;
import com.fastaccess.R;
import com.fastaccess.data.dao.GroupedNotificationModel;
import com.fastaccess.data.dao.model.Notification;
import com.fastaccess.data.dao.model.Repo;
import com.fastaccess.helper.Logger;
import com.fastaccess.helper.PrefGetter;
import com.fastaccess.helper.RxHelper;
import com.fastaccess.provider.rest.RestProvider;
import com.fastaccess.provider.tasks.notification.ReadNotificationService;
import com.fastaccess.ui.base.mvp.BaseMvp;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
/**
* Created by Kosh on 20 Feb 2017, 8:46 PM
*/
public class AllNotificationsPresenter extends BasePresenter<AllNotificationsMvp.View> implements AllNotificationsMvp.Presenter {
private ArrayList<GroupedNotificationModel> notifications = new ArrayList<>();
@Override public void onItemClick(int position, View v, GroupedNotificationModel model) {
if (getView() == null) return;
if (model.getType() == GroupedNotificationModel.ROW) {
Notification item = model.getNotification();
if (v.getId() == R.id.markAsRead) {
if (item.isUnread() && !PrefGetter.isMarkAsReadEnabled()) {
markAsRead(position, v, item);
}
} else if (v.getId() == R.id.unsubsribe) {
item.setUnread(false);
manageSubscription(item.save(item).subscribe());
sendToView(view -> view.onUpdateReadState(new GroupedNotificationModel(item), position));
ReadNotificationService.unSubscribe(v.getContext(), item.getId());
} else {
if (item.getSubject() != null && item.getSubject().getUrl() != null) {
if (item.isUnread() && !PrefGetter.isMarkAsReadEnabled()) {
markAsRead(position, v, item);
}
if (getView() != null) getView().onClick(item.getSubject().getUrl());
}
}
} else {
if (v.getId() == R.id.markAsRead) {
Repo repo = model.getRepo();
if (repo == null) return;
getView().onMarkAllByRepo(repo);
}
}
}
private void markAsRead(int position, View v, Notification item) {
item.setUnread(false);
manageSubscription(item.save(item).subscribe());
sendToView(view -> view.onUpdateReadState(new GroupedNotificationModel(item), position));
ReadNotificationService.start(v.getContext(), item.getId());
}
@Override public void onItemLongClick(int position, View v, GroupedNotificationModel item) {}
@Override public void onError(@NonNull Throwable throwable) {
onWorkOffline();
super.onError(throwable);
}
@Override public void onWorkOffline() {
if (notifications.isEmpty()) {
manageSubscription(RxHelper.getObserver(Notification.getAlltNotifications())
.flatMap(notifications -> Observable.from(GroupedNotificationModel.construct(notifications)).toList())
.subscribe(models -> sendToView(view -> view.onNotifyAdapter(models))));
} else {
sendToView(BaseMvp.FAView::hideProgress);
}
}
@NonNull @Override public ArrayList<GroupedNotificationModel> getNotifications() {
return notifications;
}
@Override public void onCallApi() {
// Observable<List<Notification>> notifications = RestProvider.getNotificationService().getAllNotifications()
// .flatMap(response -> response.getItems() != null ? Observable.from(response.getItems()) : Observable.empty())
// .filter(ObjectsCompat::nonNull)
// .flatMap(notification -> RestProvider.getNotificationService().isSubscribed(notification.getId())
// .onErrorReturn(throwable -> null),
// (notification, subscriptionModel) -> {
// if (subscriptionModel != null) {
// notification.setIsSubscribed(subscriptionModel.isSubscribed());
// } else {
// notification.setIsSubscribed(true);
// }
// return notification;
// })
// .toList();
Observable<List<GroupedNotificationModel>> observable = RestProvider.getNotificationService().getAllNotifications()
.flatMap(response -> {
if (response.getItems() != null) manageSubscription(Notification.save(response.getItems()).subscribe());
return Observable.just(GroupedNotificationModel.construct(response.getItems()));
});
makeRestCall(observable, response -> sendToView(view -> view.onNotifyAdapter(response)));
}
@Override public void onMarkAllAsRead(@NonNull List<GroupedNotificationModel> data) {
manageSubscription(RxHelper.getObserver(Observable.from(data))
.filter(group -> group.getType() == GroupedNotificationModel.ROW)
.filter(group -> group.getNotification() != null && group.getNotification().isUnread())
.map(GroupedNotificationModel::getNotification)
.subscribe(notification -> {
Logger.e(notification.getUrl());
notification.setUnread(false);
manageSubscription(notification.save(notification).subscribe());
sendToView(view -> view.onReadNotification(notification));
}));
}
@Override public void onMarkReadByRepo(@NonNull List<GroupedNotificationModel> data, @NonNull Repo repo) {
manageSubscription(RxHelper.getObserver(Observable.from(data))
.filter(group -> group.getType() == GroupedNotificationModel.ROW)
.filter(group -> group.getNotification() != null && group.getNotification().isUnread())
.filter(group -> group.getNotification().getRepository().getFullName().equalsIgnoreCase(repo.getFullName()))
.map(GroupedNotificationModel::getNotification)
.subscribe(notification -> {
Logger.e(notification.getUrl());
notification.setUnread(false);
manageSubscription(notification.save(notification).subscribe());
sendToView(view -> view.onReadNotification(notification));
}));
}
}