package com.fastaccess.data.dao;
import android.support.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import com.fastaccess.data.dao.model.Notification;
import com.fastaccess.data.dao.model.Repo;
import com.fastaccess.helper.InputHelper;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import static com.annimon.stream.Collectors.toList;
/**
* Created by Kosh on 18 Apr 2017, 8:07 PM
*/
@Getter @Setter public class GroupedNotificationModel {
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GroupedNotificationModel model = (GroupedNotificationModel) o;
return notification != null && model.getNotification() != null && notification.getId() == (model.notification.getId());
}
@Override public int hashCode() {
return notification != null ? InputHelper.getSafeIntId(notification.getId()) : 0;
}
public static final int HEADER = 1;
public static final int ROW = 2;
private int type;
private Repo repo;
private Notification notification;
private Date date;
public GroupedNotificationModel(Repo repo) {
this.type = HEADER;
this.repo = repo;
}
public GroupedNotificationModel(Notification notification) {
this.type = ROW;
this.notification = notification;
this.date = notification.getUpdatedAt();
}
@NonNull public static List<GroupedNotificationModel> construct(@Nullable List<Notification> items) {
List<GroupedNotificationModel> models = new ArrayList<>();
if (items == null || items.isEmpty()) return models;
Map<Repo, List<Notification>> grouped = Stream.of(items)
.collect(Collectors.groupingBy(Notification::getRepository, LinkedHashMap::new,
Collectors.mapping(o -> o, toList())));
Stream.of(grouped)
.filter(repoListEntry -> repoListEntry.getValue() != null && !repoListEntry.getValue().isEmpty())
.forEach(repoListEntry -> {
Repo repo = repoListEntry.getKey();
List<Notification> notifications = repoListEntry.getValue();
models.add(new GroupedNotificationModel(repo));
Stream.of(notifications)
.sorted((o1, o2) -> o2.getUpdatedAt().compareTo(o1.getUpdatedAt()))
.forEach(notification -> models.add(new GroupedNotificationModel(notification)));
});
return models;
}
@NonNull public static List<GroupedNotificationModel> onlyNotifications(@Nullable List<Notification> items) {
if (items == null || items.isEmpty()) return new ArrayList<>();
return Stream.of(items)
.map(GroupedNotificationModel::new)
.collect(Collectors.toList());
}
}