package com.xda.one.api.retrofit;
import com.xda.one.api.inteface.PrivateMessageClient;
import com.xda.one.api.misc.EventBus;
import com.xda.one.api.misc.Result;
import com.xda.one.api.model.interfaces.Message;
import com.xda.one.api.model.request.RequestMessage;
import com.xda.one.api.model.response.container.ResponseMessageContainer;
import com.xda.one.constants.XDAConstants;
import com.xda.one.event.message.MessageDeletedEvent;
import com.xda.one.event.message.MessageSendingFailedEvent;
import com.xda.one.event.message.MessageSentEvent;
import com.xda.one.event.message.MessageStatusToggledEvent;
import com.xda.one.util.Utils;
import android.content.Context;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
import retrofit.http.Body;
import retrofit.http.DELETE;
import retrofit.http.GET;
import retrofit.http.Header;
import retrofit.http.POST;
import retrofit.http.PUT;
import retrofit.http.Query;
import static com.xda.one.api.retrofit.RetrofitClient.getAuthToken;
public class RetrofitPrivateMessageClient implements PrivateMessageClient {
private static PrivateMessageClient sMessageClient;
private final PrivateMessageAPI mMessageAPI;
private final EventBus mBus;
private RetrofitPrivateMessageClient(final Context context) {
mMessageAPI = RetrofitClient.getRestBuilder(context, XDAConstants.ENDPOINT_URL)
.build()
.create(PrivateMessageAPI.class);
mBus = new EventBus();
}
public static PrivateMessageClient getClient(final Context context) {
if (sMessageClient == null) {
sMessageClient = new RetrofitPrivateMessageClient(context);
}
return sMessageClient;
}
@Override
public EventBus getBus() {
return mBus;
}
@Override
public ResponseMessageContainer getInboxMessages(final int page) {
try {
return mMessageAPI.getInboxMessages(getAuthToken(), page);
} catch (RetrofitError error) {
Utils.handleRetrofitErrorQuietly(error);
}
return null;
}
@Override
public ResponseMessageContainer getSentMessages(final int page) {
try {
return mMessageAPI.getSentMessages(getAuthToken(), page);
} catch (RetrofitError error) {
Utils.handleRetrofitErrorQuietly(error);
}
return null;
}
@Override
public void sendMessageAsync(final String username, final String subject,
final String message) {
final RequestMessage requestMessage = new RequestMessage(username, subject, message);
mMessageAPI.sendMessageAsync(getAuthToken(), requestMessage, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
final Result result = Result.parseResultFromResponse(response);
mBus.post(Result.isSuccess(result)
? new MessageSentEvent()
: new MessageSendingFailedEvent());
}
@Override
public void failure(final RetrofitError error) {
Utils.handleRetrofitErrorQuietly(error);
mBus.post(new MessageSendingFailedEvent());
}
});
}
@Override
public void toggleMessageReadAsync(final Message responseMessage) {
if (responseMessage.isMessageUnread()) {
markMessageReadAsync(responseMessage);
} else {
markMessageUnreadAsync(responseMessage);
}
}
@Override
public void markMessageReadAsync(final Message message) {
final int id = message.getPmId();
mMessageAPI.markMessageReadAsync(getAuthToken(), id, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
final Result result = Result.parseResultFromResponse(response);
if (result != null && result.isSuccess()) {
// TODO - due to the way the int works this may not actually be correct
message.setMessageReadStatus(1);
mBus.post(new MessageStatusToggledEvent(message));
} else {
// TODO
}
}
@Override
public void failure(final RetrofitError error) {
Utils.handleRetrofitErrorQuietly(error);
}
});
}
@Override
public void markMessageUnreadAsync(final Message message) {
final int id = message.getPmId();
mMessageAPI.markMessageUnreadAsync(getAuthToken(), id, new Callback<Response>() {
@Override
public void success(final Response response, final Response response2) {
final Result result = Result.parseResultFromResponse(response);
if (result != null && result.isSuccess()) {
message.setMessageReadStatus(0);
mBus.post(new MessageStatusToggledEvent(message));
} else {
// TODO
}
}
@Override
public void failure(RetrofitError error) {
Utils.handleRetrofitErrorQuietly(error);
}
});
}
@Override
public void deleteMessageAsync(final Message message) {
mMessageAPI.deleteMessageAsync(getAuthToken(), message.getPmId(), new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
final Result result = Result.parseResultFromResponse(response);
if (Result.isSuccess(result)) {
mBus.post(new MessageDeletedEvent(message));
} else {
// TODO
}
}
@Override
public void failure(RetrofitError error) {
Utils.handleRetrofitErrorQuietly(error);
}
});
}
protected static interface PrivateMessageAPI {
@GET("/pms/inbox")
public ResponseMessageContainer getInboxMessages(@Header("Cookie") final String cookie,
@Query("page") final int page);
@GET("/pms/sent")
public ResponseMessageContainer getSentMessages(@Header("Cookie") final String cookie,
@Query("page") final int page);
@POST("/pms/send")
public void sendMessageAsync(@Header("Cookie") final String cookie,
@Body final RequestMessage message, final Callback<Response> response);
@PUT("/pms/markread")
public void markMessageReadAsync(@Header("Cookie") final String cookie,
@Query("pmid") final int messageId, final Callback<Response> response);
@PUT("/pms/markunread")
public void markMessageUnreadAsync(@Header("Cookie") final String cookie,
@Query("pmid") final int messageId, final Callback<Response> response);
@DELETE("/pms")
public void deleteMessageAsync(@Header("Cookie") final String cookie,
@Query("pmid") final int messageId, final Callback<Response> response);
}
}