package com.quinn.githubknife.interactor;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import com.quinn.githubknife.R;
import com.quinn.githubknife.account.GitHubAccount;
import com.quinn.githubknife.listener.OnLoadUserInfoListener;
import com.quinn.githubknife.model.GithubService;
import com.quinn.githubknife.model.RetrofitUtil;
import com.quinn.githubknife.utils.L;
import com.quinn.githubknife.utils.LogicUtils;
import com.quinn.httpknife.github.Empty;
import com.quinn.httpknife.github.Github;
import com.quinn.httpknife.github.GithubImpl;
import com.quinn.httpknife.github.Repository;
import com.quinn.httpknife.github.User;
import java.util.List;
import retrofit.Call;
import retrofit.Callback;
import retrofit.Response;
import retrofit.Retrofit;
import rx.Scheduler;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by Quinn on 7/22/15.
*/
public class UserInfoInteractorImpl implements UserInfoInteractor {
private final static String TAG = UserInfoInteractorImpl.class.getSimpleName();
private final static int USER_MSG = 1;
private final static int FOLLOW_STATE_MSG = 2;
private final static int FAIL_MSG = 3;
private Context context;
private GitHubAccount gitHubAccount;
private OnLoadUserInfoListener listener;
private GithubService service;
private Handler handler;
private Github github;
public UserInfoInteractorImpl(Context context, final OnLoadUserInfoListener listener) {
this.context = context;
this.listener = listener;
this.service = RetrofitUtil.getJsonRetrofitInstance(context).create(GithubService.class);
this.gitHubAccount = GitHubAccount.getInstance(context);
this.github = new GithubImpl(context);
this.handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case USER_MSG:
User user = (User) msg.obj;
listener.onFinish(user);
break;
case FOLLOW_STATE_MSG:
boolean isFollow = (boolean) msg.obj;
listener.updateFollowState(isFollow);
break;
case FAIL_MSG:
listener.onError((String) msg.obj);
break;
}
}
};
}
@Override
public void auth() {
L.i(TAG, "begin to auth");
service.authUser()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<User>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
L.i(TAG,"auth onFailure = " + e.toString());
RetrofitUtil.printThrowable(e);
listener.onError(context.getString(R.string.fail_auth_user));
}
@Override
public void onNext(Response<User> userResponse) {
L.i(TAG,"auth onResponse");
RetrofitUtil.printResponse(userResponse);
if (userResponse.code() == 401) {
gitHubAccount.invalidateToken(RetrofitUtil.token);
auth();
} else if(userResponse.isSuccess()) {
listener.onFinish(userResponse.body());
}
}
});
}
@Override
public void userInfo(final String username) {
service.user(username)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<User>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
RetrofitUtil.printThrowable(e);
listener.onError(context.getString(R.string.fail_load_userInfo) + username);
}
@Override
public void onNext(Response<User> userResponse) {
RetrofitUtil.printResponse(userResponse);
if (userResponse.code() == 401) {
gitHubAccount.invalidateToken(RetrofitUtil.token);
userInfo(username);
}else if(userResponse.isSuccess()) {
listener.onFinish(userResponse.body());
}
}
});
}
@Override
public void hasFollow(final String targetUser) {
service.hasFollow(targetUser)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<Empty>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
RetrofitUtil.printThrowable(e);
listener.onError(context.getString(R.string.fail_load_relation));
}
@Override
public void onNext(Response<Empty> response) {
RetrofitUtil.printResponse(response);
if (response.code() == 401) {
gitHubAccount.invalidateToken(RetrofitUtil.token);
hasFollow(targetUser);
} else if(response.code() == 204){
listener.updateFollowState(true);
} else if(response.code() == 404){
listener.updateFollowState(false);
} else {
listener.onError(context.getString(R.string.fail_load_relation));
}
}
});
}
@Override
public void follow(final String targetUser) {
service.follow(targetUser)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<Empty>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
RetrofitUtil.printThrowable(e);
listener.onError(context.getString(R.string.fail_follow) + targetUser);
}
@Override
public void onNext(Response<Empty> response) {
if (response.code() == 401) {
gitHubAccount.invalidateToken(RetrofitUtil.token);
follow(targetUser);
} if(response.code() == 204){
listener.updateFollowState(true);
}else{
listener.onError(context.getString(R.string.fail_follow) + targetUser);
}
}
});
}
@Override
public void unFollow(final String targetUser) {
service.unFollow(targetUser)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<Empty>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
RetrofitUtil.printThrowable(e);
listener.onError(context.getString(R.string.fail_unfollow) + targetUser);
}
@Override
public void onNext(Response<Empty> response) {
if (response.code() == 401) {
if (response.code() == 401) {
gitHubAccount.invalidateToken(RetrofitUtil.token);
unFollow(targetUser);
}
if (response.code() == 204) {
listener.updateFollowState(false);
} else {
listener.onError(context.getString(R.string.fail_unfollow) + targetUser);
}
}
}
});
}
@Override
public void starredCount(final String user) {
service.starredCount(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<Repository>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
listener.onError(context.getString(R.string.fail_unfollow) + user);
}
@Override
public void onNext(Response<List<Repository>> response) {
RetrofitUtil.printResponse(response);
if (response.code() == 401) {
gitHubAccount.invalidateToken(RetrofitUtil.token);
starredCount(user);
}
if (response.isSuccess()) {
String linkHeader = response.headers().get("Link");
L.i(TAG,"linkHeader = " + linkHeader);
if(TextUtils.isEmpty(linkHeader) == false) {
int count = LogicUtils.parseStarredCount(linkHeader);
listener.loadStarredCount(count);
}else{
listener.loadStarredCount(response.body().size());
}
} else {
listener.onError(context.getString(R.string.fail_unfollow) + user);
}
}
});
}
}