package com.gzsll.hupu.ui.post;
import android.content.Context;
import android.support.annotation.NonNull;
import com.gzsll.hupu.Constants;
import com.gzsll.hupu.api.forum.ForumApi;
import com.gzsll.hupu.bean.PermissionData;
import com.gzsll.hupu.bean.PostData;
import com.gzsll.hupu.bean.UploadData;
import com.gzsll.hupu.bean.UploadInfo;
import com.gzsll.hupu.injector.PerActivity;
import com.gzsll.hupu.util.SettingPrefUtil;
import com.gzsll.hupu.util.ToastUtil;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by sll on 2016/3/9.
*/
@PerActivity
public class PostPresenter implements PostContract.Presenter {
private ForumApi mForumApi;
private Context mContext;
@Inject
public PostPresenter(ForumApi forumApi, Context context) {
mForumApi = forumApi;
mContext = context;
}
private Subscription mSubscription;
private PostContract.View mPostView;
private ArrayList<String> paths = new ArrayList<>();
private int uploadCount = 0;
@Override
public void checkPermission(int type, String fid, String tid) {
mSubscription = mForumApi.checkPermission(fid, tid,
type == Constants.TYPE_POST ? "threadPublish" : "threadReply")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<PermissionData>() {
@Override
public void call(PermissionData permissionData) {
if (permissionData != null) {
if (permissionData.error != null) {
mPostView.renderError(permissionData.error);
} else if (SettingPrefUtil.isNeedExam(mContext)) {
mPostView.renderExam(permissionData.exam);
}
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
}
@Override
public void parse(ArrayList<String> paths) {
this.paths = paths;
}
@Override
public void comment(final String tid, final String fid, final String pid, final String content) {
mPostView.showLoading();
if (paths != null && !paths.isEmpty()) {
final List<String> images = new ArrayList<>();
mSubscription = Observable.from(paths)
.flatMap(new Func1<String, Observable<UploadData>>() {
@Override
public Observable<UploadData> call(String s) {
return mForumApi.upload(s);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<UploadData>() {
@Override
public void onStart() {
uploadCount = 0;
images.clear();
}
@Override
public void onCompleted() {
uploadCount++;
if (uploadCount == paths.size()) {
addReply(tid, fid, pid, content, images);
}
}
@Override
public void onError(Throwable e) {
uploadCount++;
if (uploadCount == paths.size()) {
addReply(tid, fid, pid, content, images);
}
}
@Override
public void onNext(UploadData uploadData) {
if (uploadData != null) {
for (UploadInfo info : uploadData.files) {
images.add(info.requestUrl);
}
}
}
});
} else {
addReply(tid, fid, pid, content, null);
}
}
private void addReply(String tid, String fid, String pid, String content, List<String> imgs) {
StringBuilder buffer = new StringBuilder(content);
if (imgs != null) {
for (String url : imgs) {
buffer.append("<br><br><img src=\"").append(url).append("\"><br><br>");
}
}
System.out.println("buffer:" + buffer.toString());
mSubscription = mForumApi.addReplyByApp(tid, fid, pid, buffer.toString())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<PostData>() {
@Override
public void call(PostData data) {
mPostView.hideLoading();
if (data != null) {
if (data.error != null) {
ToastUtil.showToast(data.error.text);
} else if (data.status == 200) {
ToastUtil.showToast("发送成功~");
mPostView.postSuccess();
}
} else {
ToastUtil.showToast("您的网络有问题,请检查后重试");
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
mPostView.hideLoading();
ToastUtil.showToast("您的网络有问题,请检查后重试");
}
});
}
@Override
public void post(final String fid, final String content, final String title) {
mPostView.showLoading();
if (paths != null && !paths.isEmpty()) {
final List<String> images = new ArrayList<>();
mSubscription = Observable.from(paths)
.flatMap(new Func1<String, Observable<UploadData>>() {
@Override
public Observable<UploadData> call(String s) {
return mForumApi.upload(s);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<UploadData>() {
@Override
public void onStart() {
uploadCount = 0;
images.clear();
}
@Override
public void onCompleted() {
uploadCount++;
if (uploadCount == paths.size()) {
addPost(fid, content, title, images);
}
}
@Override
public void onError(Throwable e) {
uploadCount++;
if (uploadCount == paths.size()) {
addPost(fid, content, title, images);
}
}
@Override
public void onNext(UploadData uploadData) {
if (uploadData != null) {
for (UploadInfo info : uploadData.files) {
images.add(info.requestUrl);
}
}
}
});
} else {
addPost(fid, content, title, null);
}
}
private void addPost(String fid, String content, String title, List<String> imgs) {
StringBuilder buffer = new StringBuilder(content);
if (imgs != null) {
for (String url : imgs) {
buffer.append("<br><br><img src=\"").append(url).append("\"><br><br>");
}
}
mSubscription = mForumApi.addThread(title, buffer.toString(), fid)
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<PostData>() {
@Override
public void call(PostData data) {
mPostView.hideLoading();
if (data != null) {
if (data.error != null) {
ToastUtil.showToast(data.error.text);
} else if (data.status == 200) {
ToastUtil.showToast("发送成功~");
mPostView.postSuccess();
}
} else {
ToastUtil.showToast("您的网络有问题,请检查后重试");
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
mPostView.hideLoading();
ToastUtil.showToast("您的网络有问题,请检查后重试");
}
});
}
@Override
public void attachView(@NonNull PostContract.View view) {
mPostView = view;
}
@Override
public void detachView() {
if (mSubscription != null && !mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
}
mPostView = null;
}
}