package com.cheikh.lazywaimai.controller;
import com.cheikh.lazywaimai.R;
import com.cheikh.lazywaimai.model.bean.Favorite;
import com.cheikh.lazywaimai.util.StringFetcher;
import com.google.common.base.Preconditions;
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.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.ProductCategory;
import com.cheikh.lazywaimai.model.bean.ResponseError;
import com.cheikh.lazywaimai.model.bean.ResultsPage;
import com.cheikh.lazywaimai.model.event.ShoppingCartChangeEvent;
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 static com.cheikh.lazywaimai.util.Constants.HttpCode.HTTP_UNAUTHORIZED;
public class BusinessController extends BaseController<BusinessController.BusinessUi,
BusinessController.BusinessUiCallbacks> {
private static final int PAGE_SIZE = 10;
private final RestApiClient mRestApiClient;
private int mPageIndex;
@Inject
public BusinessController(RestApiClient restApiClient) {
super();
mRestApiClient = Preconditions.checkNotNull(restApiClient, "restApiClient cannot be null");
}
@Subscribe
public void onShoppingCartChanged(ShoppingCartChangeEvent event) {
for (BusinessUi ui : getUis()) {
if (ui instanceof ProductListUi) {
((ProductListUi) ui).onShoppingCartChange();
break;
}
}
}
@Override
protected void onInited() {
super.onInited();
EventUtil.register(this);
}
@Override
protected void onSuspended() {
EventUtil.unregister(this);
super.onSuspended();
}
@Override
protected void populateUi(BusinessUi ui) {
if (ui instanceof BusinessListUi) {
populateBusinessListUi((BusinessListUi) ui);
} else if (ui instanceof BusinessTabUi) {
populateBusinessTabUi((BusinessTabUi) ui);
} else if (ui instanceof ProductListUi) {
populateProductListUi((ProductListUi) ui);
}
}
private void populateBusinessListUi(BusinessListUi ui) {
mPageIndex = 1;
doFetchBusinesses(getId(ui), mPageIndex, PAGE_SIZE);
}
private void populateBusinessTabUi(BusinessTabUi ui) {
ui.setTabs(BusinessTab.PRODUCT, BusinessTab.COMMENT, BusinessTab.DETAIL);
}
private void populateProductListUi(ProductListUi ui) {
doFetchProducts(getId(ui), ui.getRequestParameter());
}
/**
* 分页获取商家列表数据
* @param callingId
* @param page
*/
private void doFetchBusinesses(final int callingId, final int page, int size) {
mRestApiClient.businessService()
.businesses(page, size)
.map(new Func1<ResultsPage<Business>, List<Business>>() {
@Override
public List<Business> call(ResultsPage<Business> results) {
return results.results;
}
})
.subscribeOn(Schedulers.io())
.doOnSubscribe(new Action0() {
@Override
public void call() {
BusinessUi ui = findUi(callingId);
if (ui instanceof BusinessListUi) {
((BusinessListUi) ui).onStartRequest(page);
}
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<List<Business>>() {
@Override
public void onResponse(List<Business> businesses) {
BusinessUi ui = findUi(callingId);
if (ui instanceof BusinessListUi) {
boolean haveNextPage = businesses != null && businesses.size() == PAGE_SIZE;
((BusinessListUi) ui).onFinishRequest(businesses, page, haveNextPage);
}
}
@Override
public void onFailure(ResponseError error) {
BusinessUi ui = findUi(callingId);
if (ui instanceof BusinessListUi) {
ui.onResponseError(error);
}
}
});
}
/**
* 获取指定商家下的所有商品数据
* @param callingId
* @param business
*/
private void doFetchProducts(final int callingId, Business business) {
mRestApiClient.businessService()
.products(business.getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<List<ProductCategory>>() {
@Override
public void onResponse(List<ProductCategory> businesses) {
BusinessUi ui = findUi(callingId);
if (ui instanceof ProductListUi) {
((ProductListUi) ui).onChangeItem(businesses);
}
}
@Override
public void onFailure(ResponseError error) {
BusinessUi ui = findUi(callingId);
if (ui instanceof ProductListUi) {
ui.onResponseError(error);
}
}
});
}
/**
* 收藏\取消收藏店铺
* @param callingId
* @param business
*/
private void doFavoriteBusiness(final int callingId, Business business, final boolean isLike) {
if (!AppCookie.isLoggin()) {
BusinessUi ui = findUi(callingId);
if (ui instanceof BusinessTabUi) {
ResponseError error = new ResponseError(HTTP_UNAUTHORIZED,
StringFetcher.getString(R.string.toast_error_not_login));
ui.onResponseError(error);
}
} else {
mRestApiClient.businessService()
.favorite(business.getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new RequestCallback<Favorite>() {
@Override
public void onResponse(Favorite favorite) {
BusinessUi ui = findUi(callingId);
if (ui instanceof BusinessTabUi) {
((BusinessTabUi) ui).onFavoriteFinish(isLike);
}
}
@Override
public void onFailure(ResponseError error) {
BusinessUi ui = findUi(callingId);
if (ui instanceof BusinessTabUi) {
ui.onResponseError(error);
}
}
});
}
}
@Override
protected BusinessUiCallbacks createUiCallbacks(final BusinessUi ui) {
return new BusinessUiCallbacks() {
@Override
public void refresh() {
if (ui instanceof BusinessListUi) {
mPageIndex = 1;
doFetchBusinesses(getId(ui), mPageIndex, PAGE_SIZE);
} else if (ui instanceof ProductListUi) {
doFetchProducts(getId(ui), ui.getRequestParameter());
}
}
@Override
public void nextPage() {
if (ui instanceof BusinessListUi) {
++mPageIndex;
doFetchBusinesses(getId(ui), mPageIndex, PAGE_SIZE);
}
}
@Override
public void favoriteBusiness(Business business, boolean isLike) {
doFavoriteBusiness(getId(ui), business, isLike);
}
@Override
public boolean enableSettle(Business business) {
ShoppingCart shoppingCart = ShoppingCart.getInstance();
return (shoppingCart.getTotalPrice() > business.getMinPrice())
&& (shoppingCart.getTotalQuantity() > 0);
}
@Override
public double distanceSettlePrice(Business business) {
ShoppingCart shoppingCart = ShoppingCart.getInstance();
double distancePrice = business.getMinPrice() - shoppingCart.getTotalPrice();
return distancePrice > 0 ? distancePrice : 0;
}
@Override
public void callBusinessPhone(Business business) {
Display display = getDisplay();
if (display != null) {
display.callPhone(business.getPhone());
}
}
@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 showSettle() {
Display display = getDisplay();
if (display != null) {
if (AppCookie.isLoggin()) {
display.showSettle();
} else {
display.showLogin();
}
}
}
};
}
public enum BusinessTab {
PRODUCT, COMMENT, DETAIL
}
public interface BusinessUiCallbacks {
void refresh();
void nextPage();
void favoriteBusiness(Business business, boolean isLike);
boolean enableSettle(Business business);
double distanceSettlePrice(Business business);
void callBusinessPhone(Business business);
void showSettle();
void showBusiness(Business business);
}
public interface BusinessUi extends BaseController.Ui<BusinessUiCallbacks> {
Business getRequestParameter();
}
public interface BusinessListUi extends BusinessUi, BaseController.ListUi<Business, BusinessUiCallbacks> {}
public interface BusinessTabUi extends BusinessUi {
void setTabs(BusinessTab... tabs);
void onFavoriteFinish(boolean isLike);
}
public interface ProductListUi extends BaseController.SubUi, BusinessUi {
void onChangeItem(List<ProductCategory> items);
void onShoppingCartChange();
}
public interface CommentListUi extends BaseController.SubUi, BusinessUi {
}
public interface BusinessProfileUi extends BaseController.SubUi, BusinessUi {
}
}