package com.mozu.mozuandroidinstoreassistant.app.order.loaders;
import android.support.v4.util.ArrayMap;
import com.mozu.api.MozuApiContext;
import com.mozu.api.contracts.commerceruntime.fulfillment.ShippingRate;
import com.mozu.api.contracts.commerceruntime.orders.Order;
import com.mozu.api.contracts.commerceruntime.orders.OrderAction;
import com.mozu.api.contracts.commerceruntime.orders.OrderItem;
import com.mozu.api.contracts.customer.CustomerAccount;
import com.mozu.api.contracts.location.Location;
import com.mozu.api.contracts.location.LocationCollection;
import com.mozu.api.contracts.productadmin.DiscountCollection;
import com.mozu.api.contracts.productadmin.LocationInventory;
import com.mozu.api.contracts.productadmin.LocationInventoryCollection;
import com.mozu.api.contracts.productadmin.ProductVariationPagedCollection;
import com.mozu.api.contracts.productruntime.ProductSearchResult;
import com.mozu.api.resources.commerce.LocationResource;
import com.mozu.api.resources.commerce.OrderResource;
import com.mozu.api.resources.commerce.catalog.admin.DiscountResource;
import com.mozu.api.resources.commerce.catalog.admin.products.LocationInventoryResource;
import com.mozu.api.resources.commerce.catalog.admin.products.ProductVariationResource;
import com.mozu.api.resources.commerce.catalog.storefront.ProductSearchResultResource;
import com.mozu.api.resources.commerce.customer.CustomerAccountResource;
import com.mozu.api.resources.commerce.orders.AppliedDiscountResource;
import com.mozu.api.resources.commerce.orders.OrderItemResource;
import com.mozu.api.resources.commerce.orders.ShipmentResource;
import com.mozu.mozuandroidinstoreassistant.app.data.product.FulfillmentInfo;
import com.mozu.mozuandroidinstoreassistant.app.order.OrderStrings;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.subjects.AsyncSubject;
public class NewOrderManager {
public static final String PRODUCT_SORT_BY = "productname asc";
private static final int ITEMS_PER_PAGE = 20;
public static int count = 0;
private static NewOrderManager mNewOrderManager;
private AsyncSubject<ProductSearchResult> mProductSearchSubject;
private AsyncSubject<Order> mOrderSubject;
private AsyncSubject<CustomerAccount> mCustomerSubject;
private String mSearch;
private Integer mCustomerId;
private AsyncSubject<ArrayMap<String, String>> mLocationSubject;
private NewOrderManager() {
}
public static NewOrderManager getInstance() {
if (mNewOrderManager == null) {
mNewOrderManager = new NewOrderManager();
}
return mNewOrderManager;
}
public void invalidateProductSearch() {
mProductSearchSubject = null;
}
public void invalidateOrderData() {
mOrderSubject = null;
}
public void invalidateCustomerInfo() {
mCustomerSubject = null;
}
public Observable<Order> getOrderData(int tenantId, int siteId, String orderId, boolean hardReset) {
if (hardReset || mOrderSubject == null) {
mOrderSubject = AsyncSubject.create();
getOrderObservable(tenantId, siteId, orderId).subscribeOn(Schedulers.io()).subscribe(mOrderSubject);
}
return mOrderSubject;
}
public Observable<CustomerAccount> getCustomerData(int tenantId, int siteId, Integer customerId) {
if (mCustomerSubject == null || !customerId.equals(mCustomerId)) {
mCustomerId = customerId;
mCustomerSubject = AsyncSubject.create();
getCustomerInfoObservable(tenantId, siteId, customerId).subscribeOn(Schedulers.io()).subscribe(mCustomerSubject);
}
return mCustomerSubject;
}
public Observable<ProductSearchResult> getProductSuggestion(String search, int tenantId, int siteId) {
if (mProductSearchSubject == null || search == null || !search.equals(mSearch)) {
mSearch = search;
mProductSearchSubject = AsyncSubject.create();
getProductSearchSuggestion(tenantId, siteId, search).subscribeOn(Schedulers.io()).subscribe(mProductSearchSubject);
}
return mProductSearchSubject;
}
public Observable<ArrayMap<String, String>> getLocationsData(int tenantId, int siteId, boolean hardReset) {
if (mLocationSubject == null || hardReset) {
mLocationSubject = AsyncSubject.create();
getLocations(tenantId, siteId).subscribeOn(Schedulers.io()).subscribe(mLocationSubject);
}
return mLocationSubject;
}
private Observable<ProductSearchResult> getProductSearchSuggestion(Integer tenantId, Integer siteId, final String query) {
final ProductSearchResultResource productSearchResultResource = new ProductSearchResultResource(new MozuApiContext(tenantId, siteId));
return Observable
.create(new Observable.OnSubscribe<ProductSearchResult>() {
@Override
public void call(Subscriber<? super ProductSearchResult> subscriber) {
try {
ProductSearchResult result = productSearchResultResource.search(query, null,
null, null, null, null, null, null, null, null, null, null, null,
PRODUCT_SORT_BY, ITEMS_PER_PAGE, 0, null, null, null, null, null, null);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(result);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
});
}
public Observable<Order> getOrderItemCreateObservable(final Integer tenantId, final Integer siteId, final OrderItem orderItem, final String orderId) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder;
final OrderItemResource orderItemResource = new OrderItemResource(new MozuApiContext(tenantId, siteId));
updatedOrder = orderItemResource.createOrderItem(orderItem, orderId);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
}).subscribeOn(Schedulers.io());
}
public Observable<Order> getDeleteOrderItemObservable(final Integer tenantId, final Integer siteId, final String orderItemId, final String orderId) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder;
final OrderItemResource orderItemResource = new OrderItemResource(new MozuApiContext(tenantId, siteId));
updatedOrder = orderItemResource.deleteOrderItem(orderId, orderItemId);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
}).subscribeOn(Schedulers.io());
}
public Observable<Order> createOrder(final Integer tenantId, final Integer siteId, final Order order) {
return Observable.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
final OrderResource orderResource = new OrderResource(new MozuApiContext(tenantId, siteId));
try {
Order createdOrder;
createdOrder = orderResource.createOrder(order);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(createdOrder);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<Order> getOrderItemUpdateQuantityObservable(final Integer tenantId, final Integer siteId, final OrderItem orderItem, final String orderId, final Integer quantity, final FulfillmentInfo fulFillmentType) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder = null;
final OrderItemResource orderItemResource = new OrderItemResource(new MozuApiContext(tenantId, siteId));
if (quantity != null) {
updatedOrder = orderItemResource.updateItemQuantity(orderId, orderItem.getId(), quantity);
}
if (fulFillmentType != null) {
orderItem.setFulfillmentLocationCode(fulFillmentType.mLocation);
orderItem.setFulfillmentMethod(fulFillmentType.mType);
updatedOrder = orderItemResource.updateItemFulfillment(orderItem, orderId, orderItem.getId());
}
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
}
} catch (Exception e) {
e.printStackTrace();
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
})
.subscribeOn(Schedulers.io());
}
public Observable<List<FulfillmentInfo>> getInventory(final Integer tenantId, final Integer siteId, final String productCode, final ArrayMap<String, String> locationMap) {
return Observable
.create(new Observable.OnSubscribe<List<FulfillmentInfo>>() {
@Override
public void call(Subscriber<? super List<FulfillmentInfo>> subscriber) {
try {
List<FulfillmentInfo> fulfillmentInfoList = new ArrayList<>();
LocationInventoryResource locationInventoryResource = new LocationInventoryResource(new MozuApiContext(tenantId, siteId));
LocationInventoryCollection locationInventoryCollection = locationInventoryResource.getLocationInventories(productCode);
for (LocationInventory locationInventory : locationInventoryCollection.getItems()) {
if (locationInventory.getStockAvailable() > 0) {
String locationType = locationMap.get(locationInventory.getLocationCode());
if (locationType != null) {
FulfillmentInfo fulfillmentInfo = new FulfillmentInfo(locationType, locationInventory.getLocationCode());
fulfillmentInfoList.add(fulfillmentInfo);
}
}
}
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(fulfillmentInfoList);
subscriber.onCompleted();
}
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io());
}
public Observable<ArrayMap<String, String>> getLocations(final Integer tenantId, final Integer siteId) {
return Observable
.create(new Observable.OnSubscribe<ArrayMap<String, String>>() {
@Override
public void call(Subscriber<? super ArrayMap<String, String>> subscriber) {
try {
ArrayMap<String, String> locations = new ArrayMap<String, String>();
LocationResource locationResource = new LocationResource(new MozuApiContext(tenantId, siteId));
LocationCollection locationCollection = locationResource.getInStorePickupLocations();
if (locationCollection != null) {
for (Location location : locationCollection.getItems()) {
if (location.getSupportsInventory()) {
locations.put(location.getCode(), OrderStrings.PICKUP);
}
}
}
Location directShipLocation = locationResource.getDirectShipLocation();
if (directShipLocation != null) {
locations.put(directShipLocation.getCode(), OrderStrings.SHIP);
}
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(locations);
subscriber.onCompleted();
}
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<Order> getOrderObservable(final Integer tenantId, final Integer siteId, final String orderId) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
OrderResource orderResource = new OrderResource(new MozuApiContext(tenantId, siteId));
Order order = orderResource.getOrder(orderId);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(order);
subscriber.onCompleted();
}
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io());
}
public Observable<CustomerAccount> getCustomerInfoObservable(final Integer tenantId, final Integer siteId, final Integer customerId) {
return Observable
.create(new Observable.OnSubscribe<CustomerAccount>() {
@Override
public void call(Subscriber<? super CustomerAccount> subscriber) {
try {
CustomerAccountResource customerAccountResource = new CustomerAccountResource(new MozuApiContext(tenantId, siteId));
CustomerAccount customerAccount = customerAccountResource.getAccount(customerId);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(customerAccount);
subscriber.onCompleted();
}
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io());
}
public Observable<List<ShippingRate>> getOrderShipments(final Integer tenantId, final Integer siteId, final String orderId) {
return Observable
.create(new Observable.OnSubscribe<List<ShippingRate>>() {
@Override
public void call(Subscriber<? super List<ShippingRate>> subscriber) {
try {
final ShipmentResource shipmentResource = new ShipmentResource(new MozuApiContext(tenantId, siteId));
List<ShippingRate> mShipments = shipmentResource.getAvailableShipmentMethods(orderId);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(mShipments);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<DiscountCollection> getCoupons(final Integer tenantId, final Integer siteId) {
return Observable
.create(new Observable.OnSubscribe<DiscountCollection>() {
@Override
public void call(Subscriber<? super DiscountCollection> subscriber) {
try {
final DiscountResource discountResource = new DiscountResource(new MozuApiContext(tenantId, siteId));
DiscountCollection discountCollection = discountResource.getDiscounts();
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(discountCollection);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<Order> getUpdateOrderObservable(final Integer tenantId, final Integer siteId, final Order order, final String orderId) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder;
final OrderResource orderResource = new OrderResource(new MozuApiContext(tenantId, siteId));
updatedOrder = orderResource.updateOrder(order, orderId);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<Order> getOrderActionObservable(final Integer tenantId, final Integer siteId, final Order order, final OrderAction orderAction) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder;
final OrderResource orderResource = new OrderResource(new MozuApiContext(tenantId, siteId));
updatedOrder = orderResource.performOrderAction(orderAction, order.getId());
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<Order> getApplyCouponObservable(final Integer tenantId, final Integer siteId, final String orderId, final String couponCode) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder;
final AppliedDiscountResource appliedDiscountResource = new AppliedDiscountResource(new MozuApiContext(tenantId, siteId));
updatedOrder = appliedDiscountResource.applyCoupon(orderId, couponCode);
updatedOrder.getStatus();
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<Order> getRemoveCouponObservable(final Integer tenantId, final Integer siteId, final String orderId, final String couponCode) {
return Observable
.create(new Observable.OnSubscribe<Order>() {
@Override
public void call(Subscriber<? super Order> subscriber) {
try {
Order updatedOrder;
final AppliedDiscountResource appliedDiscountResource = new AppliedDiscountResource(new MozuApiContext(tenantId, siteId));
updatedOrder = appliedDiscountResource.removeCoupon(orderId, couponCode);
updatedOrder.getStatus();
subscriber.onNext(updatedOrder);
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<ProductVariationPagedCollection> getProductVariationCodes(final Integer tenantId, final Integer siteId, final String productCode) {
return Observable
.create(new Observable.OnSubscribe<ProductVariationPagedCollection>() {
@Override
public void call(Subscriber<? super ProductVariationPagedCollection> subscriber) {
try {
ProductVariationPagedCollection productVariationPagedCollection;
final ProductVariationResource productVariationResource = new ProductVariationResource(new MozuApiContext(tenantId, siteId));
productVariationPagedCollection = productVariationResource.getProductVariations(productCode);
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(productVariationPagedCollection);
subscriber.onCompleted();
}
} catch (Exception e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
}).subscribeOn(Schedulers.io());
}
}