package com.mozu.mozuandroidinstoreassistant.app.order;
import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import com.mozu.api.contracts.commerceruntime.fulfillment.Pickup;
import com.mozu.api.contracts.commerceruntime.fulfillment.PickupItem;
import com.mozu.api.contracts.commerceruntime.orders.Order;
import com.mozu.api.contracts.commerceruntime.orders.OrderItem;
import com.mozu.mozuandroidinstoreassistant.app.OrderDetailActivity;
import com.mozu.mozuandroidinstoreassistant.app.R;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentMoveToDataItem;
import com.mozu.mozuandroidinstoreassistant.app.dialog.ErrorMessageAlertDialog;
import com.mozu.mozuandroidinstoreassistant.app.order.adapters.OrderFulfillmentMoveToItemAdapter;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.PickupObservablesManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import rx.Subscriber;
import rx.android.observables.AndroidObservable;
public class OrderFulfillmentMoveToPickupDialogFragment extends DialogFragment implements OrderFulfillmentMoveToItemAdapter.MoveToListListener {
private static final String FULFILLED = "fulfilled";
private static final String SELECTED = "selected";
@InjectView(R.id.items)
RecyclerView mRecyclerViewProducts;
@InjectView(R.id.cancel)
Button mCancel;
@InjectView(R.id.move_to)
Spinner mMoveToOptions;
private FulfillmentMoveToDataItem mData;
private List<String> options;
private ArrayList<Integer> selected = new ArrayList<>();
private Order mOrder;
private int createNewPickUpCount;
private OrderFulfillmentMoveToItemAdapter mProductsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
selected = savedInstanceState.getIntegerArrayList(SELECTED);
}
setRetainInstance(true);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(true);
return dialog;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fulfillment_move_to, container, false);
ButterKnife.inject(this, view);
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!options.contains(getResources().getString(R.string.move_to)) && !options.contains(getResources().getString(R.string.create_new_pickup))) {
options.add(getResources().getString(R.string.create_new_pickup));
options.add(0, getResources().getString(R.string.move_to));
}
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
mRecyclerViewProducts.setLayoutManager(layoutManager);
mProductsAdapter = new OrderFulfillmentMoveToItemAdapter(mData.getItems(), this);
if (selected != null && !selected.isEmpty()) {
mProductsAdapter.setSelected(selected);
}
mRecyclerViewProducts.setAdapter(mProductsAdapter);
mRecyclerViewProducts.setHasFixedSize(true);
ArrayAdapter<String> dropDownAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, options);
dropDownAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mMoveToOptions.setAdapter(dropDownAdapter);
mMoveToOptions.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position > 0) {
if (selected.size() > 0) {
if (position == options.size() - 1) {
createNewPickUps();
} else {
Pickup pickup = mOrder.getPickups().get(position - 1);
pickup.getItems().addAll(createNewPickUpItems());
AndroidObservable.bindFragment(OrderFulfillmentMoveToPickupDialogFragment.this,
PickupObservablesManager.getInstance(mOrder.getTenantId(), mOrder.getSiteId()).updatePickup(pickup, mOrder.getId()))
.subscribe(getPickupSubscriber());
}
} else {
Toast.makeText(getActivity(), R.string.no_items_selected_error, Toast.LENGTH_LONG).show();
mMoveToOptions.setSelection(0);
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
//do nothing
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (selected != null && !selected.isEmpty()) {
outState.putIntegerArrayList(SELECTED, selected);
}
super.onSaveInstanceState(outState);
}
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
}
public void createNewPickUps() {
List<Pickup> createPackage = createPickupsByLocale();
createNewPickUpCount = createPackage.size();
for (int i = 0; i < createNewPickUpCount; i++) {
AndroidObservable.bindFragment(OrderFulfillmentMoveToPickupDialogFragment.this,
PickupObservablesManager
.getInstance(mOrder.getTenantId(), mOrder.getSiteId())
.createPickup(createPackage.get(i), mOrder.getId()))
.subscribe(getPickupSubscriber());
}
}
public void setData(FulfillmentMoveToDataItem data, Order order) {
this.mData = data;
this.mOrder = order;
options = new ArrayList<>(order.getPickups().size() + 2);
for (Pickup pickup : mOrder.getPickups()) {
if (!FULFILLED.equalsIgnoreCase(pickup.getStatus()))
options.add(pickup.getCode());
}
}
@OnClick(R.id.cancel)
public void dismissDialog() {
this.dismiss();
}
@Override
public void onItemSelected(Integer position, boolean isSelected) {
if (isSelected) {
selected.add(position);
} else {
selected.remove(position);
}
}
private Subscriber<Pickup> getPickupSubscriber() {
return new Subscriber<Pickup>() {
@Override
public void onCompleted() {
createNewPickUpCount--;
if (createNewPickUpCount == 0) {
OrderFulfillmentMoveToPickupDialogFragment.this.dismiss();
((OrderDetailActivity) getActivity()).onRefresh();
}
}
@Override
public void onError(Throwable e) {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getActivity(), e.toString()).show();
}
@Override
public void onNext(Pickup pickup) {
//Dismiss and reload?
}
};
}
private List<Pickup> createPickupsByLocale() {
Map<String, ArrayList<PickupItem>> sortedItems = new HashMap<>();
List<Pickup> pickups = new ArrayList<>();
for (int i = 0; i < selected.size(); i++) {
PickupItem item = new PickupItem();
OrderItem orderItem = mData.getItems().get(selected.get(i));
String productCode = orderItem.getProduct().getVariationProductCode() != null ? orderItem.getProduct().getVariationProductCode() : orderItem.getProduct().getProductCode();
item.setProductCode(productCode);
item.setQuantity(orderItem.getQuantity());
item.setLineId(orderItem.getLineId());
if (sortedItems.containsKey(orderItem.getFulfillmentLocationCode())) {
ArrayList<PickupItem> items1 = sortedItems.get(orderItem.getFulfillmentLocationCode());
items1.add(item);
sortedItems.put(orderItem.getFulfillmentLocationCode(), items1);
} else {
ArrayList<PickupItem> items1 = new ArrayList<>();
items1.add(item);
sortedItems.put(orderItem.getFulfillmentLocationCode(), items1);
}
}
for (Map.Entry<String, ArrayList<PickupItem>> item : sortedItems.entrySet()) {
Pickup pickup = new Pickup();
pickup.setItems(item.getValue());
pickup.setFulfillmentLocationCode(item.getKey());
pickups.add(pickup);
}
return pickups;
}
private List<PickupItem> createNewPickUpItems() {
List<PickupItem> items = new ArrayList<>(selected.size());
for (int i = 0; i < selected.size(); i++) {
PickupItem item = new PickupItem();
OrderItem orderItem = mData.getItems().get(selected.get(i));
String productCode = orderItem.getProduct().getVariationProductCode() != null ? orderItem.getProduct().getVariationProductCode() : orderItem.getProduct().getProductCode();
item.setProductCode(productCode);
item.setQuantity(orderItem.getQuantity());
item.setLineId(orderItem.getLineId());
items.add(item);
}
return items;
}
}