package com.mozu.mozuandroidinstoreassistant.app.layout.order;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.Html;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import com.mozu.api.contracts.commerceruntime.fulfillment.ShippingRate;
import com.mozu.api.contracts.commerceruntime.orders.Order;
import com.mozu.mozuandroidinstoreassistant.app.R;
import com.mozu.mozuandroidinstoreassistant.app.data.IData;
import com.mozu.mozuandroidinstoreassistant.app.data.order.ShippingItemRow;
import com.mozu.mozuandroidinstoreassistant.app.dialog.ErrorMessageAlertDialog;
import com.mozu.mozuandroidinstoreassistant.app.layout.IRowLayout;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachine;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachineProducer;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.NewOrderManager;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import rx.Subscriber;
import rx.subscriptions.CompositeSubscription;
public class NewOrderShippingItemLayout extends LinearLayout implements IRowLayout, IEditMode {
Spinner mSpinner;
private OrderUpdateListener mOrderUpdateListener;
private Integer mTenantId;
private Integer mSiteId;
private CompositeSubscription mCompositeSubscription;
ShippingItemRow shippingItemRow;
ProgressBar progressBar;
public NewOrderShippingItemLayout(Context context) {
super(context);
init();
}
public NewOrderShippingItemLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public NewOrderShippingItemLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void setOrderUpdateListener(OrderUpdateListener updateShippingListener) {
mOrderUpdateListener = updateShippingListener;
}
private void init() {
UserAuthenticationStateMachine userStateMachine = UserAuthenticationStateMachineProducer.getInstance(getContext());
mTenantId = userStateMachine.getTenantId();
mSiteId = userStateMachine.getSiteId();
mCompositeSubscription = new CompositeSubscription();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mCompositeSubscription != null && !mCompositeSubscription.isUnsubscribed()) {
mCompositeSubscription.unsubscribe();
}
}
private void showAlertDialog(final List<ShippingRate> shippingRates, final String mOrderId) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
SpinnerDialogAdapter spinnerAdapter = new SpinnerDialogAdapter();
spinnerAdapter.setData(shippingRates);
builder.setAdapter(spinnerAdapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int position) {
applyShipping(shippingRates.get(position));
dialog.dismiss();
}
});
builder.create().show();
}
private void applyShipping(ShippingRate shippingRateSelected) {
Order order = shippingItemRow.mOrder;
com.mozu.api.contracts.commerceruntime.fulfillment.FulfillmentInfo fulfillmentInfo = order.getFulfillmentInfo();
if (fulfillmentInfo == null) {
fulfillmentInfo = new com.mozu.api.contracts.commerceruntime.fulfillment.FulfillmentInfo();
}
fulfillmentInfo.setShippingMethodCode(shippingRateSelected.getShippingMethodCode());
fulfillmentInfo.setShippingMethodName(shippingRateSelected.getShippingMethodName());
order.setFulfillmentInfo(fulfillmentInfo);
progressBar.setVisibility(View.VISIBLE);
mCompositeSubscription.add(NewOrderManager.getInstance().getUpdateOrderObservable(mTenantId, mSiteId, order, order.getId())
.subscribe(new Subscriber<Order>() {
@Override
public void onCompleted() {
progressBar.setVisibility(View.GONE);
}
@Override
public void onError(Throwable e) {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getContext(), getResources().getString(R.string.shipping_update_failure)).show();
progressBar.setVisibility(View.GONE);
}
@Override
public void onNext(Order order) {
mOrderUpdateListener.updateOrder(order);
}
}));
}
@Override
public void bindData(IData data) {
if (data instanceof ShippingItemRow) {
shippingItemRow = (ShippingItemRow) data;
progressBar = (ProgressBar) findViewById(R.id.shipping_progress);
mSpinner = (Spinner) findViewById(R.id.shipping_spinner);
mSpinner.setClickable(false);
SpinnerAdapter spinnerAdapter = new SpinnerAdapter();
List<ShippingRate> shipments = new ArrayList<>();
if (shippingItemRow.mCurrentFulfillmentInfo.getShippingMethodCode() != null) {
ShippingRate shippingRate = new ShippingRate();
shippingRate.setShippingMethodCode(shippingItemRow.mCurrentFulfillmentInfo.getShippingMethodCode());
shippingRate.setShippingMethodName(shippingItemRow.mCurrentFulfillmentInfo.getShippingMethodName());
shipments.add(shippingRate);
} else {
shipments.add(0, null);
}
spinnerAdapter.setData(shipments);
mSpinner.setAdapter(spinnerAdapter);
mSpinner.post(new Runnable() {
@Override
public void run() {
mSpinner.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {
progressBar.setVisibility(VISIBLE);
mCompositeSubscription.add(NewOrderManager.getInstance().getOrderShipments(mTenantId, mSiteId, shippingItemRow.mOrder.getId())
.subscribe(new Subscriber<List<ShippingRate>>() {
@Override
public void onCompleted() {
progressBar.setVisibility(GONE);
}
@Override
public void onError(Throwable e) {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getContext(), getResources().getString(R.string.shipping_fetch_failure)).show();
progressBar.setVisibility(GONE);
}
@Override
public void onNext(List<ShippingRate> shippingRates) {
if (shippingRates.size() > 0) {
showAlertDialog(shippingRates, shippingItemRow.mOrder.getId());
} else {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getContext(), getResources().getString(R.string.empty_shipping_rates)).show();
}
}
}));
}
return false;
}
});
}
});
}
}
public interface OrderUpdateListener {
public void updateOrder(Order order);
}
@Override
public void setEditMode(boolean isEditMode) {
}
class SpinnerAdapter extends BaseAdapter {
private List<ShippingRate> mData;
public SpinnerAdapter() {
mData = new ArrayList<>();
}
public void setData(List<ShippingRate> data) {
mData.clear();
mData.addAll(data);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.orderfulfillment_spinner_item, parent, false);
}
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
TextView mTextView = (TextView) convertView.findViewById(R.id.order_fulfillment);
ShippingRate shipment = getItem(position);
if (shipment != null) {
StringBuffer shipmentDisplay = new StringBuffer(shipment.getShippingMethodName());
if (shipment.getPrice() != null) {
shipmentDisplay.append(String.format(getResources().getString(R.string.shipping_display_format), numberFormat.format(shipment.getPrice())));
}
mTextView.setText(Html.fromHtml(shipmentDisplay.toString()));
} else {
mTextView.setText(getResources().getString(R.string.shipping_method));
}
return convertView;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public ShippingRate getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) View.inflate(parent.getContext(), R.layout.orderfulfillment_dropdown_resource, null);
ShippingRate shipment = getItem(position);
if (shipment != null) {
String shipmentDisplay = shipment.getShippingMethodName();
textView.setText(shipmentDisplay);
} else {
textView.setText(getResources().getString(R.string.shipping_method));
}
return textView;
}
}
class SpinnerDialogAdapter extends BaseAdapter {
private List<ShippingRate> mData;
public SpinnerDialogAdapter() {
mData = new ArrayList<>();
}
public void setData(List<ShippingRate> data) {
mData.clear();
mData.addAll(data);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public ShippingRate getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.orderfulfillment_spinner_item, parent, false);
}
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
TextView mTextView = (TextView) convertView.findViewById(R.id.order_fulfillment);
ShippingRate shipment = getItem(position);
if (shipment != null) {
StringBuffer shipmentDisplay = new StringBuffer(shipment.getShippingMethodName());
if (shipment.getPrice() != null) {
shipmentDisplay.append(String.format(getResources().getString(R.string.shipping_display_format), numberFormat.format(shipment.getPrice())));
}
mTextView.setText(Html.fromHtml(shipmentDisplay.toString()));
} else {
mTextView.setText(getResources().getString(R.string.shipping_method));
}
return convertView;
}
}
}