package com.marverenic.music.model.playlistrules;
import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;
import com.marverenic.music.data.store.MusicStore;
import com.marverenic.music.data.store.PlayCountStore;
import com.marverenic.music.data.store.PlaylistStore;
import com.marverenic.music.model.Playlist;
import com.marverenic.music.model.Song;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.schedulers.Schedulers;
public class PlaylistRule extends AutoPlaylistRule implements Parcelable {
protected PlaylistRule(@Field int field, @Match int match, String value) {
super(PLAYLIST, field, match, value);
}
protected PlaylistRule(Parcel in) {
super(in);
}
@Override
public Observable<List<Song>> applyFilter(PlaylistStore playlistStore, MusicStore musicStore,
PlayCountStore playCountStore) {
return playlistStore.getPlaylists()
.observeOn(Schedulers.computation())
.take(1)
.map(library -> {
List<Playlist> filtered = new ArrayList<>();
for (Playlist playlist : library) {
if (includePlaylist(playlist)) {
filtered.add(playlist);
}
}
return filtered;
})
.flatMap(Observable::from)
.concatMap(playlistStore::getSongs)
.reduce((songs, songs2) -> {
List<Song> merged = new ArrayList<>(songs);
merged.addAll(songs2);
return merged;
});
}
@SuppressLint("SwitchIntDef")
private boolean includePlaylist(Playlist playlist) {
switch (getField()) {
case ID:
return checkId(playlist.getPlaylistId());
case NAME:
return checkString(playlist.getPlaylistName());
}
throw new IllegalArgumentException("Cannot compare against field " + getField());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<PlaylistRule> CREATOR = new Creator<PlaylistRule>() {
@Override
public PlaylistRule createFromParcel(Parcel in) {
return new PlaylistRule(in);
}
@Override
public PlaylistRule[] newArray(int size) {
return new PlaylistRule[size];
}
};
}