package com.mozu.mozuandroidinstoreassistant.app.order;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.mozu.api.contracts.commerceruntime.commerce.PackageMeasurements;
import com.mozu.api.contracts.commerceruntime.orders.Order;
import com.mozu.api.contracts.commerceruntime.orders.OrderItem;
import com.mozu.api.contracts.productruntime.BundledProduct;
import com.mozu.api.contracts.productruntime.Category;
import com.mozu.api.contracts.productruntime.Product;
import com.mozu.api.contracts.productruntime.ProductOption;
import com.mozu.api.contracts.productruntime.ProductOptionValue;
import com.mozu.api.contracts.productruntime.ProductPrice;
import com.mozu.api.contracts.productruntime.ProductProperty;
import com.mozu.api.contracts.productruntime.ProductPropertyValue;
import com.mozu.api.contracts.productruntime.ProductSearchResult;
import com.mozu.mozuandroidinstoreassistant.app.OrderDetailActivity;
import com.mozu.mozuandroidinstoreassistant.app.R;
import com.mozu.mozuandroidinstoreassistant.app.bus.RxBus;
import com.mozu.mozuandroidinstoreassistant.app.data.order.OrderItemRow;
import com.mozu.mozuandroidinstoreassistant.app.layout.order.NewOrderShippingItemLayout;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachine;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachineProducer;
import com.mozu.mozuandroidinstoreassistant.app.order.adapters.NewOrderProductAdapter;
import com.mozu.mozuandroidinstoreassistant.app.order.adapters.ProductSuggestionAdapter;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.NewOrderManager;
import com.mozu.mozuandroidinstoreassistant.app.views.CustomerLookupAutoCompleteTextView;
import java.util.ArrayList;
import java.util.List;
import butterknife.ButterKnife;
import butterknife.InjectView;
import rx.Subscriber;
import rx.Subscription;
import rx.android.observables.AndroidObservable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class NewOrderCreateFragment extends Fragment implements NewOrderItemEditFragment.onItemEditDoneListener, NewOrderShippingItemLayout.OrderUpdateListener {
@InjectView(R.id.product_lookup)
public CustomerLookupAutoCompleteTextView mProductLookup;
@InjectView(R.id.product_search_loading)
public ProgressBar mProductSearchLoading;
@InjectView(R.id.product_listview)
public ListView mOrderProducts;
Subscription mSubscription;
ProductSuggestionAdapter mAdapter;
private View mView;
private int mTenantId;
private int mSiteId;
private NewOrderProductAdapter mProductsAdapter;
private Order mOrder;
private boolean mIsEditMode;
public static NewOrderCreateFragment getInstance() {
NewOrderCreateFragment newOrderCreateFragment = new NewOrderCreateFragment();
return newOrderCreateFragment;
}
public static com.mozu.api.contracts.commerceruntime.products.Product convertProduct(Product inProduct) {
com.mozu.api.contracts.commerceruntime.products.Product outProduct =
new com.mozu.api.contracts.commerceruntime.products.Product();
outProduct.setImageUrl(inProduct.getContent().getProductImages().get(0).getImageUrl());
if (inProduct.getBundledProducts() != null) {
List<com.mozu.api.contracts.commerceruntime.products.BundledProduct> outBundledProducts = new ArrayList<>();
for (BundledProduct inBundledProduct : inProduct.getBundledProducts()) {
outBundledProducts.add(convertBundledProduct(inBundledProduct));
}
outProduct.setBundledProducts(outBundledProducts);
} else {
outProduct.setBundledProducts(new ArrayList<com.mozu.api.contracts.commerceruntime.products.BundledProduct>());
}
if (inProduct.getCategories() != null) {
List<com.mozu.api.contracts.commerceruntime.products.Category> outCategories = new ArrayList<>();
for (Category inCategory : inProduct.getCategories()) {
outCategories.add(convertCategory(inCategory));
}
outProduct.setCategories(outCategories);
} else {
outProduct.setCategories(new ArrayList<com.mozu.api.contracts.commerceruntime.products.Category>());
}
outProduct.setDescription(inProduct.getContent() != null ? inProduct.getContent().getProductShortDescription() : null);
outProduct.setFulfillmentTypesSupported(inProduct.getFulfillmentTypesSupported());
outProduct.setIsPackagedStandAlone(inProduct.getIsPackagedStandAlone());
outProduct.setIsRecurring(inProduct.getIsRecurring());
outProduct.setIsTaxable(inProduct.getIsTaxable());
outProduct.setMeasurements(convertMeasurements(inProduct.getMeasurements()));
outProduct.setMfgPartNumber(inProduct.getMfgPartNumber());
outProduct.setName(inProduct.getContent() != null ? inProduct.getContent().getProductName() : null);
if (inProduct.getOptions() != null) {
List<com.mozu.api.contracts.commerceruntime.products.ProductOption> options = new ArrayList<>();
for (com.mozu.api.contracts.productruntime.ProductOption inOption : inProduct.getOptions()) {
options.add(convertOptions(inOption));
}
outProduct.setOptions(options);
}
outProduct.setPrice(convertPrice(inProduct.getPrice()));
outProduct.setProductCode(inProduct.getProductCode());
outProduct.setProductType(inProduct.getProductType());
outProduct.setProductUsage(inProduct.getProductUsage());
if (inProduct.getProperties() != null) {
List<com.mozu.api.contracts.commerceruntime.products.ProductProperty> properties = new ArrayList<>();
for (ProductProperty inProperty : inProduct.getProperties()) {
properties.add(convertProperties(inProperty));
}
outProduct.setProperties(properties);
}
outProduct.setUpc(inProduct.getUpc());
outProduct.setVariationProductCode(inProduct.getVariationProductCode());
return outProduct;
}
public static com.mozu.api.contracts.commerceruntime.products.ProductProperty convertProperties(
ProductProperty inProperty) {
com.mozu.api.contracts.commerceruntime.products.ProductProperty outProperty =
new com.mozu.api.contracts.commerceruntime.products.ProductProperty();
outProperty.setAttributeFQN(inProperty.getAttributeFQN());
if (inProperty.getAttributeDetail() != null) {
outProperty.setDataType(inProperty.getAttributeDetail().getDataType());
outProperty.setName(inProperty.getAttributeDetail().getName());
}
outProperty.setIsMultiValue(inProperty.getIsMultiValue());
List<com.mozu.api.contracts.commerceruntime.products.ProductPropertyValue> values = new ArrayList<>();
for (ProductPropertyValue inValue : inProperty.getValues()) {
values.add(convertProductPropertyValue(inValue));
}
outProperty.setValues(values);
return outProperty;
}
public static com.mozu.api.contracts.commerceruntime.products.ProductPropertyValue convertProductPropertyValue(
ProductPropertyValue inProperty) {
com.mozu.api.contracts.commerceruntime.products.ProductPropertyValue outProperty =
new com.mozu.api.contracts.commerceruntime.products.ProductPropertyValue();
outProperty.setStringValue(inProperty.getStringValue());
outProperty.setValue(inProperty.getValue());
return outProperty;
}
public static com.mozu.api.contracts.commerceruntime.products.ProductPrice convertPrice(ProductPrice inPrice) {
com.mozu.api.contracts.commerceruntime.products.ProductPrice outPrice =
new com.mozu.api.contracts.commerceruntime.products.ProductPrice();
if (inPrice != null) {
outPrice.setMsrp(inPrice.getMsrp());
outPrice.setPrice(inPrice.getPrice());
outPrice.setSalePrice(inPrice.getSalePrice());
}
return outPrice;
}
public static com.mozu.api.contracts.commerceruntime.products.ProductOption convertOptions(
ProductOption inOption) {
com.mozu.api.contracts.commerceruntime.products.ProductOption outOption =
new com.mozu.api.contracts.commerceruntime.products.ProductOption();
outOption.setAttributeFQN(inOption.getAttributeFQN());
if (inOption.getAttributeDetail() != null) {
outOption.setDataType(inOption.getAttributeDetail().getDataType());
outOption.setName(inOption.getAttributeDetail().getName());
}
for (ProductOptionValue productOptionValue : inOption.getValues()) {
if (productOptionValue.getIsSelected()) {
outOption.setShopperEnteredValue(productOptionValue.getShopperEnteredValue());
outOption.setValue(productOptionValue.getValue());
}
}
return outOption;
}
public static com.mozu.api.contracts.commerceruntime.products.Category convertCategory(
Category inCategory) {
if (inCategory == null)
return null;
com.mozu.api.contracts.commerceruntime.products.Category outCategory =
new com.mozu.api.contracts.commerceruntime.products.Category();
outCategory.setId(inCategory.getCategoryId());
outCategory.setParent(convertCategory(inCategory.getParentCategory()));
return outCategory;
}
public static com.mozu.api.contracts.commerceruntime.products.BundledProduct convertBundledProduct(
BundledProduct inBundledProduct) {
com.mozu.api.contracts.commerceruntime.products.BundledProduct outBundledProduct =
new com.mozu.api.contracts.commerceruntime.products.BundledProduct();
outBundledProduct.setIsPackagedStandAlone(inBundledProduct.getIsPackagedStandAlone());
outBundledProduct.setMeasurements(convertMeasurements(inBundledProduct.getMeasurements()));
if (inBundledProduct.getContent() != null) {
outBundledProduct.setDescription(inBundledProduct.getContent().getProductShortDescription());
outBundledProduct.setName(inBundledProduct.getContent().getProductName());
}
outBundledProduct.setProductCode(inBundledProduct.getProductCode());
outBundledProduct.setQuantity(inBundledProduct.getQuantity());
return outBundledProduct;
}
public static PackageMeasurements convertMeasurements(
com.mozu.api.contracts.productruntime.PackageMeasurements measurements) {
com.mozu.api.contracts.commerceruntime.commerce.PackageMeasurements pkgMeasurements =
new com.mozu.api.contracts.commerceruntime.commerce.PackageMeasurements();
if (measurements != null) {
pkgMeasurements.setHeight(measurements.getPackageHeight());
pkgMeasurements.setLength(measurements.getPackageLength());
pkgMeasurements.setWeight(measurements.getPackageWeight());
pkgMeasurements.setWidth(measurements.getPackageWidth());
}
return pkgMeasurements;
}
public void setOrder(Order order) {
mOrder = order;
}
public void setEditMode(Boolean isEditMode) {
mIsEditMode = isEditMode;
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
new Handler().post(new Runnable() {
@Override
public void run() {
if (getActivity() instanceof OrderDetailActivity) {
((OrderDetailActivity) getActivity()).setEditModeVisibility(isVisibleToUser);
}
}
});
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setUpViews();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
RxBus.getInstance().toObserverable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getEventSubscriber());
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.new_order_details_fragment, null);
UserAuthenticationStateMachine mUserState = UserAuthenticationStateMachineProducer.getInstance(getActivity());
mSiteId = mUserState.getSiteId();
mTenantId = mUserState.getTenantId();
ButterKnife.inject(this, mView);
NewOrderManager.count = 0;
return mView;
}
private Subscriber<Object> getEventSubscriber() {
return new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
if (o instanceof Boolean) {
mIsEditMode = (Boolean) o;
updateEditMode(mIsEditMode);
}
}
};
}
private void updateEditMode(Boolean editMode) {
mProductsAdapter.setEditMode(editMode);
mProductsAdapter.addData(mOrder);
mProductsAdapter.notifyDataSetChanged();
mProductLookup.setVisibility(editMode ? View.VISIBLE : View.GONE);
}
private void lookUpProduct(final String search) {
if (mSubscription != null && !mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
mProductSearchLoading.setVisibility(View.GONE);
}
mProductSearchLoading.setVisibility(View.VISIBLE);
mSubscription = AndroidObservable.bindFragment(NewOrderCreateFragment.this, NewOrderManager.getInstance().getProductSuggestion(search, mTenantId, mSiteId))
.subscribe(new Subscriber<ProductSearchResult>() {
@Override
public void onCompleted() {
mProductSearchLoading.setVisibility(View.GONE);
}
@Override
public void onError(Throwable e) {
mProductSearchLoading.setVisibility(View.GONE);
Toast.makeText(getActivity(), "Error Searching for product " + search, Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(ProductSearchResult productSearchResult) {
List<Product> data = productSearchResult.getItems();
mAdapter.clear();
mAdapter.addAll(data);
mAdapter.notifyDataSetChanged();
if (TextUtils.isEmpty(search)) {
mProductLookup.showDropDown();
}
}
});
}
private void setUpViews() {
mAdapter = new ProductSuggestionAdapter(getActivity());
mProductLookup.setAdapter(mAdapter);
mProductsAdapter = new NewOrderProductAdapter(this);
if (mOrder != null && mOrder.getItems() != null) {
mProductsAdapter.addData(mOrder);
updateEditMode(mIsEditMode);
}
mOrderProducts.setAdapter(mProductsAdapter);
mProductLookup.setThreshold(0);
mProductLookup.post(new Runnable() {
@Override
public void run() {
mProductLookup.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (mProductLookup.getText().length() == 0) {
lookUpProduct(null);
}
return false;
}
});
}
});
mProductLookup.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(final CharSequence charSequence, int start, int before, int count) {
if (!TextUtils.isEmpty(charSequence.toString())) {
if (mSubscription != null && !mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
mProductSearchLoading.setVisibility(View.GONE);
}
mProductSearchLoading.setVisibility(View.VISIBLE);
lookUpProduct(charSequence.toString());
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mProductLookup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
Product product = (Product) adapterView.getItemAtPosition(position);
OrderItem orderItem = new OrderItem();
orderItem.setProduct(convertProduct(product));
orderItem.setQuantity(1);
NewOrderItemEditFragment newOrderItemEditFragment = NewOrderItemEditFragment.getInstance(orderItem, mOrder.getId(), false);
newOrderItemEditFragment.setOnEditDoneListener(NewOrderCreateFragment.this);
newOrderItemEditFragment.show(getFragmentManager(), "");
}
});
mOrderProducts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
if (mIsEditMode && adapterView.getItemAtPosition(position) instanceof OrderItemRow) {
OrderItem orderItem = ((OrderItemRow) adapterView.getItemAtPosition(position)).orderItem;
NewOrderItemEditFragment newOrderItemEditFragment = NewOrderItemEditFragment.getInstance(orderItem, mOrder.getId(), true);
newOrderItemEditFragment.setOnEditDoneListener(NewOrderCreateFragment.this);
newOrderItemEditFragment.show(getFragmentManager(), "");
}
}
});
updateEditMode(mIsEditMode);
}
@Override
public void onEditDone(Order order) {
mOrder = order;
mProductsAdapter.addData(mOrder);
mProductsAdapter.setEditMode(mIsEditMode);
mProductsAdapter.notifyDataSetChanged();
if (getActivity() instanceof NewOrderActivity) {
((NewOrderActivity) getActivity()).updateOrder(mOrder);
} else if (getActivity() instanceof OrderDetailActivity) {
((OrderDetailActivity) getActivity()).onRefresh();
}
}
@Override
public void updateOrder(Order order) {
onEditDone(order);
}
}