package apps.makarov.com.whereismycurrency.net;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.util.List;
import apps.makarov.com.whereismycurrency.repository.IRepository;
import apps.makarov.com.whereismycurrency.net.requests.WimcRequest;
import io.realm.RealmObject;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;
/**
* Created by makarov on 29/06/15.
*/
public class RequestService {
private OkHttpClient mClient;
private IRepository mStore;
public RequestService(OkHttpClient client, IRepository store) {
this.mClient = client;
this.mStore = store;
}
protected IRepository getStore(){
return mStore;
}
protected <T> Observable<List<T>> getObservableRequest(final WimcRequest request, final Observable<List<T>> observableDateFromLocalStore) {
boolean urlInCache = mStore.hasUrlInCache(request.getPath());
return urlInCache ? observableDateFromLocalStore :
observableNetwork(request)
.flatMap(new Func1<List, Observable<Exception>>() {
@Override
public Observable<Exception> call(List list) {
return observableSaveObjects(list);
}
})
.flatMap(new Func1<Exception, Observable<List<T>>>() {
@Override
public Observable<List<T>> call(Exception e) {
return observableDateFromLocalStore;
}
});
}
private Observable<List> observableNetwork(final WimcRequest request) {
return getResponse(request)
.flatMap(new Func1<Response, Observable<String>>() {
@Override
public Observable<String> call(Response response) {
return responseToString(response);
}
}).flatMap(new Func1<String, Observable<List>>() {
@Override
public Observable<List> call(String s) {
return request.observableStringToObjectsList(s);
}
});
}
private final Observable<Response> getResponse(final WimcRequest wimcRequest) {
return Observable.create(new Observable.OnSubscribe<Response>() {
@Override
public void call(Subscriber<? super Response> subscriber) {
try {
Request request = wimcRequest.getRequest();
Response response = mClient.newCall(request).execute();
subscriber.onNext(response);
subscriber.onCompleted();
} catch (Throwable e) {
subscriber.onError(e);
}
}
});
}
private Observable<String> responseToString(final Response response) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
try {
subscriber.onNext(response.body().string());
subscriber.onCompleted();
} catch (Throwable e) {
subscriber.onError(e);
}
}
});
}
private Observable<Exception> observableSaveObjects(final List<? extends RealmObject> list) {
return Observable.create(new Observable.OnSubscribe<Exception>() {
@Override
public void call(Subscriber<? super Exception> subscriber) {
try {
for (RealmObject object : list) {
mStore.saveObject(object);
}
subscriber.onNext(null);
subscriber.onCompleted();
} catch (Throwable e) {
subscriber.onError(e);
}
}
});
}
}