package treehou.se.habit.util;
import android.content.Context;
import android.support.v4.util.Pair;
import java.util.ArrayList;
import java.util.List;
import butterknife.Unbinder;
import io.realm.Realm;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.observers.Subscribers;
import rx.schedulers.Schedulers;
import se.treehou.ng.ohcommunicator.connector.models.OHServer;
import se.treehou.ng.ohcommunicator.connector.models.OHSitemap;
import se.treehou.ng.ohcommunicator.services.Connector;
import se.treehou.ng.ohcommunicator.services.IServerHandler;
import treehou.se.habit.core.db.DBHelper;
import treehou.se.habit.core.db.model.ServerDB;
import treehou.se.habit.core.db.model.SitemapDB;
import treehou.se.habit.core.db.model.SitemapSettingsDB;
public class RxUtil {
private RxUtil() {}
public static <T> Observable.Transformer<T, T> newToMainSchedulers() {
return observable -> observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* Save sitemap to database
* @return action that saves sitemap.
*/
public static Action1<Pair<OHServer, List<OHSitemap>>> saveSitemap(){
return serverDBListPair -> {
Realm realm = Realm.getDefaultInstance();
for(OHSitemap sitemap : serverDBListPair.second){
OHServer server = serverDBListPair.first;
ServerDB serverDB = realm.where(ServerDB.class)
.equalTo("name", server.getName())
.equalTo("localurl", server.getLocalUrl())
.equalTo("remoteurl", server.getRemoteUrl())
.findFirst();
SitemapDB sitemapDB = realm.where(SitemapDB.class)
.equalTo("server.name", serverDBListPair.first.getName())
.equalTo("name", sitemap.getName())
.findFirst();
if(sitemapDB == null){
SitemapSettingsDB sitemapSettingsDB = new SitemapSettingsDB();
sitemapSettingsDB.setDisplay(true);
sitemapSettingsDB.setId(DBHelper.getUniqueId(realm, SitemapSettingsDB.class));
sitemapDB = new SitemapDB();
sitemapDB.setServer(serverDB);
sitemapDB.setId(SitemapDB.getUniqueId(realm));
sitemapDB.setLabel(sitemap.getLabel());
sitemapDB.setLink(sitemap.getLink());
sitemapDB.setName(sitemap.getName());
realm.beginTransaction();
sitemapDB = realm.copyToRealm(sitemapDB);
realm.commitTransaction();
}
if(sitemapDB.getSettingsDB() == null){
SitemapSettingsDB sitemapSettingsDB = new SitemapSettingsDB();
boolean showSitemap = !"_default".equalsIgnoreCase(sitemapDB.getName());
sitemapSettingsDB.setDisplay(showSitemap);
sitemapSettingsDB.setId(DBHelper.getUniqueId(realm, SitemapSettingsDB.class));
realm.beginTransaction();
sitemapSettingsDB = realm.copyToRealm(sitemapSettingsDB);
sitemapDB.setSettingsDB(sitemapSettingsDB);
realm.commitTransaction();
}
}
realm.close();
};
}
/**
* Load servers from database.
* @return observable for generic server objects.
*/
public static Observable.Transformer<Realm, OHServer> loadServers() {
return observable -> observable.flatMap(realmLocal ->
realmLocal.where(ServerDB.class).isNotEmpty("localurl").or().isNotEmpty("remoteurl").greaterThan("id", 0).findAllAsync().asObservable())
.flatMap(Observable::from)
.map(ServerDB::toGeneric)
.distinct();
}
/**
* Creates a sitemap settings object for sitemap if not already exists
* @return sitemap with settings set.
*/
public static Observable.Transformer<SitemapDB, SitemapDB> createSettingsIfEmpty() {
return observable -> observable.map(new Func1<SitemapDB, SitemapDB>() {
@Override
public SitemapDB call(SitemapDB sitemapDB) {
if (sitemapDB.getSettingsDB() == null) {
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
SitemapSettingsDB sitemapSettingsDB = realm.createObject(SitemapSettingsDB.class);
sitemapDB.setSettingsDB(sitemapSettingsDB);
realm.commitTransaction();
}
return sitemapDB;
}
});
}
}