package com.androideasyapps.phoenix;
import com.androideasyapps.phoenix.dao.H2PersistenceManager;
import com.androideasyapps.phoenix.dao.MediaFile;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import rx.Observable;
import rx.Subscriber;
/**
* Created by seans on 04/01/15.
*/
public class TVGapsUtil {
public static class Pair<T> {
public Pair(T f, T s) {
this.first=f;
this.second=s;
}
public T first;
public T second;
}
public static Collection<MediaFile> getTVGapFiles(Future<H2PersistenceManager> dao) throws Exception {
Collection<MediaFile> files = new ArrayList<>();
Map<String,List<Pair<Integer>>> gaps = getTVGaps(dao);
for (Map.Entry<String, List<Pair<Integer>>> me: gaps.entrySet()) {
for (Pair<Integer> p: me.getValue()) {
MediaFile mf = new MediaFile();
mf.setTitle(me.getKey());
mf.setEpisodeTitle("N/A");
mf.setSeason(p.first);
mf.setEpisode(p.second);
mf.setOriginalAirDate(System.currentTimeMillis());
mf.setMediaType("tv");
files.add(mf);
}
}
return files;
}
public static Observable<Collection<MediaFile>> getTVGapFilesObserable(final Future<H2PersistenceManager> dao) {
return Observable.create(new Observable.OnSubscribe<Collection<MediaFile>>() {
@Override
public void call(Subscriber<? super Collection<MediaFile>> subscriber) {
try {
subscriber.onStart();
subscriber.onNext(getTVGapFiles(dao));
} catch (Throwable t) {
subscriber.onError(t);
}
}
});
};
public static Map<String, List<Pair<Integer>>> getTVGaps(Future<H2PersistenceManager> dao) throws Exception {
String allShowsQuery = "mediatype='tv' order by title, season, episode";
Collection<MediaFile> files = dao.get().getMediaFileDAO().query(allShowsQuery);
return getTVGaps(files);
}
public static Map<String, List<Pair<Integer>>> getTVGaps(Collection<MediaFile> files) throws Exception {
Map<String, List<Pair<Integer>>> gaps = new TreeMap<>();
String lastTitle=null;
int lastSeason=-1;
int lastEpisode=0;
for (MediaFile mf: files) {
if (!mf.getTitle().equalsIgnoreCase(lastTitle)) {
lastTitle=mf.getTitle();
lastSeason=0;
lastEpisode=0;
}
if (mf.getSeason()!=lastSeason) {
lastSeason=mf.getSeason();
lastEpisode=0;
}
if (lastEpisode!=0) {
fillGaps(gaps, lastTitle, lastSeason, lastEpisode, mf.getEpisode());
}
lastEpisode=mf.getEpisode();
}
return gaps;
}
private static void fillGaps(Map<String, List<Pair<Integer>>> gaps, String title, int lastSeason, int lastEpisode, int episode) {
if (episode-lastEpisode>1) {
List<Pair<Integer>> g = gaps.get(title);
if (g==null) {
g=new ArrayList<>();
gaps.put(title, g);
}
for (int i=lastEpisode+1;i<episode;i++) {
g.add(new Pair<Integer>(lastSeason, i));
}
}
}
}