package com.cheikh.lazywaimai.controller;
import android.os.Handler;
import com.cheikh.lazywaimai.model.bean.CartInfo;
import com.cheikh.lazywaimai.model.bean.PaymentPlatform;
import com.cheikh.lazywaimai.repository.SettingManager;
import com.google.common.base.Preconditions;
import com.google.gson.Gson;
import com.squareup.otto.Subscribe;
import java.util.List;
import javax.inject.Inject;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import com.cheikh.lazywaimai.R;
import com.cheikh.lazywaimai.base.BaseController;
import com.cheikh.lazywaimai.context.AppCookie;
import com.cheikh.lazywaimai.model.ShoppingCart;
import com.cheikh.lazywaimai.model.bean.Business;
import com.cheikh.lazywaimai.model.bean.Order;
import com.cheikh.lazywaimai.model.bean.ResponseError;
import com.cheikh.lazywaimai.model.bean.ResultsPage;
import com.cheikh.lazywaimai.model.bean.SettleResult;
import com.cheikh.lazywaimai.model.event.AccountChangedEvent;
import com.cheikh.lazywaimai.network.RequestCallback;
import com.cheikh.lazywaimai.network.RestApiClient;
import com.cheikh.lazywaimai.ui.Display;
import com.cheikh.lazywaimai.util.EventUtil;
import com.cheikh.lazywaimai.util.StringFetcher;
import static com.cheikh.lazywaimai.util.Constants.HttpCode.HTTP_UNAUTHORIZED;
/**
* author: cheikh.wang on 17/1/5
* email: wanghonghi@126.com
*/
public class OrderController extends BaseController<OrderController.OrderUi, OrderController.OrderUiCallbacks> {
private static final int PAGE_SIZE = 10;
private final RestApiClient mRestApiClient;
private final SettingManager mSettingManager;
private int mPageIndex;
@Inject
public OrderController(RestApiClient restApiClient, SettingManager settingManager) {
super();
mRestApiClient = Preconditions.checkNotNull(restApiClient, "restApiClient cannot be null");
mSettingManager = Preconditions.checkNotNull(settingManager, "settingManager cannot be null");
}
@Subscribe
public void onAccountChanged(AccountChangedEvent event) {
populateUis();
}
@Override
protected void onInited() {
super.onInited();
EventUtil.register(this);
}
@Override
protected void onSuspended() {
EventUtil.unregister(this);
super.onSuspended();
}
@Override
protected void populateUi(OrderUi ui) {
if (ui instanceof OrderListUi) {
populateOrderListUi((OrderListUi) ui);
} else if (ui instanceof OrderDetailUi) {
populateOrderDetailUi((OrderDetailUi) ui);
} else if (ui instanceof OrderSettleUi) {
populateOrderSettleUi((OrderSettleUi) ui);
} else if (ui instanceof OrderRemarkUi) {
populateOrderRemarkUi((OrderRemarkUi) ui);
} else if (ui instanceof OrderPaymentUi) {
populateOrderPaymentUi((OrderPaymentUi) ui);
}
}
private void populateOrderListUi(OrderListUi ui) {
mPageIndex = 1;
doFetchOrders(getId(ui), mPageIndex, PAGE_SIZE);
}
private void populateOrderDetailUi(OrderDetailUi ui) {
doFetchOrder(getId(ui), ui.getRequestParameter());
}
private void populateOrderSettleUi(OrderSettleUi ui) {
doOrderSettle(getId(ui), true);
}
private void populateOrderRemarkUi(OrderRemarkUi ui) {
ui.setCommonRemarks(mSettingManager.getCommonRemarks());
}
private void populateOrderPaymentUi(OrderPaymentUi ui) {
ui.setPlatforms(mSettingManager.getPaymentPlatform());
}
private void doFetchOrders(final int callingId, final int page, int size) {
if (!AppCookie.isLoggin()) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderListUi) {
ResponseError error = new ResponseError(HTTP_UNAUTHORIZED,
StringFetcher.getString(R.string.toast_error_not_login));
ui.onResponseError(error);
}
} else {
mRestApiClient.orderService()
.orders(page, size)
.map(new Func1<ResultsPage<Order>, List<Order>>() {
@Override
public List<Order> call(ResultsPage<Order> results) {
return results.results;
}
})
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderListUi) {
((OrderListUi) ui).onStartRequest(page);
}
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<List<Order>>() {
@Override
public void onResponse(List<Order> orders) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderListUi) {
boolean haveNextPage = orders != null && orders.size() == PAGE_SIZE;
((OrderListUi) ui).onFinishRequest(orders, page, haveNextPage);
}
}
@Override
public void onFailure(ResponseError error) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderListUi) {
ui.onResponseError(error);
}
}
});
}
}
/**
* 获取订单详情
* @param callingId
*/
private void doFetchOrder(final int callingId, String id) {
mRestApiClient.orderService()
.detail(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<Order>() {
@Override
public void onResponse(Order order) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderDetailUi) {
((OrderDetailUi) ui).showOrderInfo(order);
}
}
@Override
public void onFailure(ResponseError error) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderDetailUi) {
ui.onResponseError(error);
}
}
});
}
/**
* 在线支付
* @param callingId
*/
private void doPayment(final int callingId, final Order order, String platformId) {
mRestApiClient.orderService()
.payment(order.getId(), platformId, order.getTotalPrice())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<Object>() {
@Override
public void onResponse(Object object) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderPaymentUi) {
((OrderPaymentUi) ui).onFinishPayment(order);
}
}
@Override
public void onFailure(ResponseError error) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderPaymentUi) {
ui.onResponseError(error);
}
}
});
}
/**
* 执行订单结算
* @param callingId
*/
private void doOrderSettle(final int callingId, boolean isOnlinePayment) {
ShoppingCart shoppingCart = ShoppingCart.getInstance();
mRestApiClient.orderService()
.settle(shoppingCart.getBusinessId(), isOnlinePayment ? 1 : 0,
new Gson().toJson(shoppingCart.getShoppingList()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<SettleResult>() {
@Override
public void onResponse(SettleResult settleResult) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderSettleUi) {
((OrderSettleUi) ui).onSettleFinish(settleResult);
}
}
@Override
public void onFailure(ResponseError error) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderSettleUi) {
ui.onResponseError(error);
}
}
});
}
/**
* 执行订单提交
* @param callingId
* @param cartId
* @param remark
* @param bookedAt
*/
private void doOrderCreate(final int callingId, String cartId, long bookedAt, String remark) {
mRestApiClient.orderService()
.submit(cartId, bookedAt, remark)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<Order>() {
@Override
public void onResponse(Order order) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderSettleUi) {
((OrderSettleUi) ui).onOrderCreateFinish(order);
}
}
@Override
public void onFailure(ResponseError error) {
OrderUi ui = findUi(callingId);
if (ui instanceof OrderSettleUi) {
ui.onResponseError(error);
}
}
});
}
@Override
protected OrderUiCallbacks createUiCallbacks(final OrderUi ui) {
return new OrderUiCallbacks() {
@Override
public void refresh() {
if (ui instanceof OrderListUi) {
mPageIndex = 1;
doFetchOrders(getId(ui), mPageIndex, PAGE_SIZE);
} else if (ui instanceof OrderDetailUi) {
doFetchOrder(getId(ui), ui.getRequestParameter());
}
}
@Override
public void nextPage() {
if (ui instanceof OrderListUi) {
++mPageIndex;
doFetchOrders(getId(ui), mPageIndex, PAGE_SIZE);
}
}
@Override
public void showLogin() {
Display display = getDisplay();
if (display != null) {
display.showLogin();
}
}
@Override
public void chooseAddress() {
Display display = getDisplay();
if (display != null) {
display.showChooseAddress();
}
}
@Override
public void settle() {
doOrderSettle(getId(ui), true);
}
@Override
public void orderCreate(String cartId, long bookedAt, String remark) {
doOrderCreate(getId(ui), cartId, bookedAt, remark);
}
@Override
public void togglePayMethod(boolean isOnlinePayment) {
// 切换付款方式需要显示弹出式loading对话框
doOrderSettle(getId(ui), isOnlinePayment);
}
@Override
public void showRemark(String remark, int requestCode) {
Display display = getDisplay();
if (display != null) {
display.showRemark(remark, requestCode);
}
}
@Override
public void showPayment(Order order) {
Display display = getDisplay();
if (display != null) {
display.showPayment(order);
}
}
@Override
public void showOrderDetail(Order order) {
Display display = getDisplay();
if (display != null) {
display.showOrderDetail(order);
}
}
@Override
public void showBusiness(Business business) {
Preconditions.checkNotNull(business, "business cannot be null");
Display display = getDisplay();
if (display != null) {
display.showBusiness(business);
}
}
@Override
public void showEvaluate() {
// 显示评价页面
}
@Override
public void payment(final Order order, final String platformId) {
// 模拟耗时
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doPayment(getId(ui), order, platformId);
}
}, 2000);
}
@Override
public void confirmReceived() {
// TODO 确认送达的逻辑
}
@Override
public void orderAgain(Order order) {
CartInfo cartInfo = order.getCartInfo();
if (cartInfo != null) {
ShoppingCart.getInstance().again(cartInfo.getShoppingProducts());
Display display = getDisplay();
if (display != null) {
display.showBusiness(order.getBusinessInfo());
}
}
}
};
}
public interface OrderUiCallbacks {
void refresh();
void nextPage();
void showLogin();
void settle();
void chooseAddress();
void orderCreate(String cartId, long bookedAt, String remark);
void togglePayMethod(boolean isOnlinePayment);
void showRemark(String remark, int requestCode);
void showPayment(Order order);
void showOrderDetail(Order order);
void showBusiness(Business business);
void showEvaluate();
void payment(Order order, String platformId);
void confirmReceived();
void orderAgain(Order order);
}
public interface OrderUi extends BaseController.Ui<OrderUiCallbacks> {
String getRequestParameter();
}
public interface OrderListUi extends OrderUi, BaseController.ListUi<Order, OrderUiCallbacks> {}
public interface OrderDetailUi extends OrderUi {
void showOrderInfo(Order order);
}
public interface OrderSettleUi extends OrderUi {
void onSettleFinish(SettleResult result);
void onOrderCreateFinish(Order order);
}
public interface OrderRemarkUi extends OrderUi {
void setCommonRemarks(List<String> remarks);
}
public interface OrderPaymentUi extends OrderUi {
void setPlatforms(List<PaymentPlatform> platforms);
void onFinishPayment(Order order);
}
}