package com.tevinjeffrey.rutgersct.database;
import android.support.annotation.MainThread;
import com.squareup.otto.Bus;
import com.squareup.otto.Produce;
import com.tevinjeffrey.rutgersct.rutgersapi.model.Request;
import com.tevinjeffrey.rutgersct.utils.Utils;
import java.util.List;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
public class DatabaseHandlerImpl implements DatabaseHandler {
private final Bus bus;
public DatabaseHandlerImpl(Bus eventBus) {
this.bus = eventBus;
}
@Override
@MainThread
public void removeSectionFromDb(final Request request) {
Observable.just(removeFromDb(request))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnCompleted(new Action0() {
@Override
public void call() {
notifyOnRemoveListeners(request);
}
})
.subscribe();
}
public Observable<List<TrackedSections>> getAllSections() {
return Observable.just(TrackedSections.listAll(TrackedSections.class));
}
private int removeFromDb(Request request) {
List<TrackedSections> trackedSections = TrackedSections.find(TrackedSections.class,
"INDEX_NUMBER = ?", request.getIndex());
for (TrackedSections ts : trackedSections) {
ts.delete();
}
return trackedSections.size();
}
private void notifyOnRemoveListeners(Request request) {
bus.post(new DatabaseUpdateEvent());
}
private void notifyOnAddListeners(Request request) {
bus.post(new DatabaseUpdateEvent());
}
public boolean isSectionTracked(Request request) {
List<TrackedSections> trackedSections = TrackedSections.find(TrackedSections.class,
"INDEX_NUMBER = ?", request.getIndex());
return trackedSections != null && trackedSections.size() != 0;
}
public void addSectionToDb(final Request request) {
saveToDb(request);
Observable.just(null)
.observeOn(AndroidSchedulers.mainThread())
.doOnCompleted(new Action0() {
@Override
public void call() {
notifyOnAddListeners(request);
}
})
.subscribe();
}
public void saveToDb(Request request) {
TrackedSections trackedSections = new TrackedSections(request.getSubject(),
request.getSemester().toString(), Request.toStringList(request.getLocations()),
Request.toStringList(request.getLevels()), request.getIndex());
trackedSections.save();
}
@Produce
public DatabaseUpdateEvent produceUpdate() {
return new DatabaseUpdateEvent();
}
public Observable<List<Request>> getObservableSections() {
return getAllSections()
.map(new Func1<List<TrackedSections>, List<Request>>() {
@Override
public List<Request> call(List<TrackedSections> trackedSections) {
return Utils.createRequestObservableFromTrackedSections(trackedSections)
.toList().toBlocking().single();
}
});
}
}