package com.gzsll.hupu.data;
import android.text.TextUtils;
import com.gzsll.hupu.Constants;
import com.gzsll.hupu.api.forum.ForumApi;
import com.gzsll.hupu.bean.ThreadListData;
import com.gzsll.hupu.db.Thread;
import com.gzsll.hupu.db.ThreadDao;
import java.util.List;
import javax.inject.Inject;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func0;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;
/**
* Created by sll on 2016/6/3.
*/
public class ThreadRepository {
private ThreadDao mThreadDao;
private ForumApi mForumApi;
@Inject
public ThreadRepository(ThreadDao mThreadDao, ForumApi mForumApi) {
this.mThreadDao = mThreadDao;
this.mForumApi = mForumApi;
}
public Observable<List<Thread>> getThreadListObservable(final int type,
PublishSubject<List<Thread>> mSubject) {
Observable<List<Thread>> firstObservable = Observable.fromCallable(new Func0<List<Thread>>() {
@Override
public List<Thread> call() {
return mThreadDao.queryBuilder().where(ThreadDao.Properties.Type.eq(type)).list();
}
});
return firstObservable.concatWith(mSubject)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<ThreadListData> getRecommendThreadList(final String lastTid, String lastTamp,
final PublishSubject<List<Thread>> mSubject) {
return mForumApi.getRecommendThreadList(lastTid, lastTamp)
.doOnNext(new Action1<ThreadListData>() {
@Override
public void call(ThreadListData threadListData) {
if (threadListData != null && threadListData.result != null) {
cacheThreadList(0, TextUtils.isEmpty(lastTid), threadListData.result.data);
}
if (mSubject != null) {
mSubject.onNext(mThreadDao.queryBuilder()
.where(ThreadDao.Properties.Type.eq(Constants.TYPE_RECOMMEND))
.list());
}
}
})
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<ThreadListData> getThreadsList(final String fid, final String lastTid,
String lastTamp, String type, final PublishSubject<List<Thread>> mSubject) {
return mForumApi.getThreadsList(fid, lastTid, lastTamp, type)
.doOnNext(new Action1<ThreadListData>() {
@Override
public void call(ThreadListData threadListData) {
if (threadListData != null && threadListData.result != null) {
cacheThreadList(Integer.valueOf(fid), TextUtils.isEmpty(lastTid),
threadListData.result.data);
}
if (mSubject != null) {
mSubject.onNext(mThreadDao.queryBuilder()
.where(ThreadDao.Properties.Type.eq(Integer.valueOf(fid)))
.list());
}
}
})
.observeOn(AndroidSchedulers.mainThread());
}
private void cacheThreadList(int type, boolean clear, List<Thread> threads) {
if (clear) {
mThreadDao.queryBuilder()
.where(ThreadDao.Properties.Type.eq(type))
.buildDelete()
.executeDeleteWithoutDetachingEntities();
}
for (Thread thread : threads) {
if (mThreadDao.queryBuilder()
.where(ThreadDao.Properties.Tid.eq(thread.getTid()), ThreadDao.Properties.Type.eq(type))
.count() == 0) {
thread.setType(type);
mThreadDao.insert(thread);
}
}
}
}