package com.mozu.mozuandroidinstoreassistant.app.order;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputType;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.mozu.api.contracts.commerceruntime.orders.Order;
import com.mozu.api.contracts.commerceruntime.orders.OrderNote;
import com.mozu.api.contracts.commerceruntime.orders.ShopperNotes;
import com.mozu.api.contracts.core.AuditInfo;
import com.mozu.mozuandroidinstoreassistant.app.R;
import com.mozu.mozuandroidinstoreassistant.app.dialog.ErrorMessageAlertDialog;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachineProducer;
import com.mozu.mozuandroidinstoreassistant.app.order.adapters.OrderDetailNotesAdapter;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.NewOrderManager;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.OrderNoteObserverable;
import com.mozu.mozuandroidinstoreassistant.app.views.LoadingView;
import org.joda.time.DateTime;
import butterknife.ButterKnife;
import butterknife.InjectView;
import rx.Subscriber;
import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
public class OrderDetailNotesFragment extends Fragment {
@InjectView(R.id.internal_notes_layout)
LinearLayout mNoteListLayout;
@InjectView(R.id.customer_notes_layout)
LinearLayout mCustomerNotesLayout;
@InjectView(R.id.show_customer_notes)
TextView mShowCustomerNotes;
@InjectView(R.id.show_internal_notes)
TextView mShowInternalNotes;
@InjectView(R.id.add_internal_note)
Button mAddInternalNote;
@InjectView(R.id.internal_note_header)
View header;
@InjectView(R.id.customer_notes)
TextView mCustomerNote;
@InjectView(R.id.save_customer_note)
Button mCustomerNoteSave;
private Order mOrder;
private LoadingView mNotesLoadingView;
private boolean isCurrentInternalNotes = false;
private OrderDetailNotesAdapter internalNotesAdapter;
private ListView mNoteList;
public static OrderDetailNotesFragment getInstance() {
OrderDetailNotesFragment fragment = new OrderDetailNotesFragment();
Bundle bundle = new Bundle();
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.order_detail_notes_fragment, container, false);
ButterKnife.inject(this, view);
mNotesLoadingView = (LoadingView) view.findViewById(R.id.notes_loading_view);
isCurrentInternalNotes = false;
setOrderToViews(view);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCurrentInternalNotes = false;
showCustomerNotes();
}
private void setOrderToViews(View view) {
mNoteList = (ListView) view.findViewById(R.id.notes_list);
internalNotesAdapter = new OrderDetailNotesAdapter(mOrder.getNotes());
mNoteList.setAdapter(internalNotesAdapter);
mNoteList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
OrderNote orderNote = (OrderNote) adapterView.getItemAtPosition(i);
showEditNoteDialog(orderNote);
}
});
setCustomerNotes();
if (mOrder == null || mOrder.getNotes() == null || mOrder.getNotes().size() < 1) {
mNotesLoadingView.setError(getActivity().getResources().getString(R.string.not_internal_notes_available));
mNotesLoadingView.getErrorTextView().setTextColor(getResources().getColor(android.R.color.darker_gray));
header.setVisibility(View.GONE);
} else {
mNotesLoadingView.success();
}
if (isCurrentInternalNotes) {
showInternalNotes();
} else {
showCustomerNotes();
}
mShowCustomerNotes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showCustomerNotes();
isCurrentInternalNotes = false;
}
});
mShowInternalNotes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showInternalNotes();
isCurrentInternalNotes = true;
}
});
mAddInternalNote.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showAddNewNoteDialog();
}
});
}
private void showEditNoteDialog(final OrderNote orderNote) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.dialog_edit_order_notes, null);
final EditText editText = (EditText) view.findViewById(R.id.note);
final TextView title = (TextView) view.findViewById(R.id.title);
title.setText(R.string.edit_note);
editText.setText(orderNote.getText());
final AlertDialog editNoteDialog = new AlertDialog.Builder(getActivity())
.setView(view)
.setNegativeButton(R.string.delete, null)
.setNeutralButton(R.string.edit, null)
.setPositiveButton(R.string.done, null)
.create();
editNoteDialog.show();
Button positive = editNoteDialog.getButton(DialogInterface.BUTTON_POSITIVE);
Button neutral = editNoteDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
Button negative = editNoteDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
positive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateItem(editText.getText().toString(), orderNote);
editNoteDialog.dismiss();
}
});
neutral.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText.setEnabled(true);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
});
negative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteItem(orderNote);
editNoteDialog.dismiss();
}
});
}
public void setOrder(Order order) {
mOrder = order;
}
private void showCustomerNotes() {
if (mCustomerNotesLayout != null)
mCustomerNotesLayout.setVisibility(View.VISIBLE);
if (mNoteListLayout != null)
mNoteListLayout.setVisibility(View.GONE);
}
private void showInternalNotes() {
if (mCustomerNotesLayout != null)
mCustomerNotesLayout.setVisibility(View.GONE);
if (mNoteListLayout != null)
mNoteListLayout.setVisibility(View.VISIBLE);
}
private void updateItem(String latestNote, OrderNote orderNote) {
onInternalNotesUpdated(latestNote, orderNote);
}
private void deleteItem(OrderNote orderNote) {
onInternalNoteDeleted(orderNote);
}
private void showAddNewNoteDialog() {
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_edit_order_notes, null);
final EditText noteInput = (EditText) view.findViewById(R.id.note);
final TextView noteTile = (TextView) view.findViewById(R.id.title);
noteTile.setText(R.string.add_note);
noteInput.setFocusable(true);
noteInput.setEnabled(true);
noteInput.setFocusableInTouchMode(true);
noteInput.requestFocus();
noteInput.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
AlertDialog noteDialog = new AlertDialog.Builder(getActivity())
.setView(view)
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton(R.string.new_note, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String note = noteInput.getText().toString();
if (note.isEmpty()) {
noteInput.setError(getActivity().getString(R.string.required));
return;
}
addNewInternalNote(note);
setOrderToViews(OrderDetailNotesFragment.this.getView());
dialog.dismiss();
}
})
.create();
noteDialog.show();
}
private void setCustomerNotes() {
if (mOrder.getShopperNotes() == null || mOrder.getShopperNotes().getComments() == null) {
if (mOrder.getStatus().equalsIgnoreCase("Pending")) {
mCustomerNote.setHint(R.string.add_customer_note_title);
mCustomerNote.setEnabled(true);
mCustomerNote.setFocusableInTouchMode(true);
mCustomerNote.setFocusable(true);
mCustomerNote.setGravity(Gravity.LEFT);
mCustomerNote.setTextColor(getResources().getColor(R.color.darker_grey));
} else {
mCustomerNote.setText(R.string.not_customer_notes_available);
mCustomerNote.setGravity(Gravity.CENTER_HORIZONTAL);
mCustomerNote.setTextColor(getResources().getColor(R.color.darker_grey));
}
} else {
mCustomerNote.setText(mOrder.getShopperNotes().getComments());
mCustomerNote.setTextColor(getResources().getColor(R.color.dark_black_text));
}
if (mOrder.getStatus().equalsIgnoreCase("Pending")) {
mCustomerNoteSave.setVisibility(View.VISIBLE);
mCustomerNoteSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addEditCustomerNote(mCustomerNote.getText().toString());
}
});
} else {
mCustomerNoteSave.setVisibility(View.GONE);
}
}
private void addNewInternalNote(String note) {
OrderNote orderNote = new OrderNote();
AuditInfo auditInfo = new AuditInfo();
String user = UserAuthenticationStateMachineProducer
.getInstance(getActivity())
.getAuthProfile()
.getUserProfile()
.getUserName();
auditInfo.setCreateDate(new DateTime());
auditInfo.setCreateBy(user);
orderNote.setAuditInfo(auditInfo);
orderNote.setText(note);
createAndSubscribeToOrderNoteCreation(orderNote);
}
private void addEditCustomerNote(String note) {
ShopperNotes shopperNotes = new ShopperNotes();
shopperNotes.setComments(note);
updateCustomerNotes(mOrder, shopperNotes);
}
private void updateCustomerNotes(final Order order, ShopperNotes shopperNotes) {
final ShopperNotes currentShopperNotes = order.getShopperNotes();
order.setShopperNotes(shopperNotes);
AndroidObservable.bindFragment(this, NewOrderManager.getInstance().getUpdateOrderObservable(order.getTenantId(), order.getSiteId(), order, order.getId())).subscribe(new Subscriber<Order>() {
@Override
public void onCompleted() {
Toast.makeText(getActivity(), R.string.customer_notes_saved, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
mOrder.setShopperNotes(currentShopperNotes);
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getActivity(), "Error Updating Customer Note");
}
@Override
public void onNext(Order updatedOrder) {
mOrder = updatedOrder;
}
});
}
public void onInternalNotesUpdated(String note, OrderNote currentNote) {
OrderNote updatedNote = new OrderNote();
updatedNote.setText(note);
updatedNote.setId(currentNote.getId());
createAndSubscribeToOrderNoteUpdate(updatedNote);
}
public void onInternalNoteDeleted(OrderNote note) {
createAndSubscribeToOrderNoteDelete(note);
}
private void createAndSubscribeToOrderNoteUpdate(OrderNote updatedNote) {
AndroidObservable.bindFragment(this, OrderNoteObserverable.getOrderNoteObserverable(mOrder.getTenantId(), mOrder.getSiteId(), mOrder.getId(), updatedNote, OrderNoteObserverable.OrderCallType.UPDATE))
.subscribeOn(Schedulers.io())
.subscribe(new Action1<OrderNote>() {
@Override
public void call(OrderNote orderNote) {
for (OrderNote note : mOrder.getNotes()) {
if (note.getId().equalsIgnoreCase(orderNote.getId())) {
note.setText(orderNote.getText());
note.setAuditInfo(orderNote.getAuditInfo());
}
}
internalNotesAdapter.setData(mOrder.getNotes());
internalNotesAdapter.notifyDataSetChanged();
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getActivity(), "Error Updating Note");
}
});
}
private void createAndSubscribeToOrderNoteDelete(final OrderNote orderNote) {
AndroidObservable.bindFragment(this, OrderNoteObserverable.getOrderNoteObserverable(mOrder.getTenantId(), mOrder.getSiteId(), mOrder.getId(), orderNote, OrderNoteObserverable.OrderCallType.DELETION))
.subscribeOn(Schedulers.io())
.subscribe(new Action1<OrderNote>() {
@Override
public void call(OrderNote updatedOrderNote) {
mOrder.getNotes().remove(orderNote);
internalNotesAdapter.setData(mOrder.getNotes());
internalNotesAdapter.notifyDataSetChanged();
if (mOrder.getNotes().size() < 1) {
mNotesLoadingView.setError(getActivity().getResources().getString(R.string.not_internal_notes_available));
mNotesLoadingView.getErrorTextView().setTextColor(getResources().getColor(android.R.color.darker_gray));
header.setVisibility(View.GONE);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getActivity(), "Error Deleting Note");
}
});
}
private void createAndSubscribeToOrderNoteCreation(OrderNote orderNote) {
AndroidObservable.bindFragment(this, OrderNoteObserverable.getOrderNoteObserverable(mOrder.getTenantId(), mOrder.getSiteId(), mOrder.getId(), orderNote, OrderNoteObserverable.OrderCallType.CREATION))
.subscribeOn(Schedulers.io())
.subscribe(new Action1<OrderNote>() {
@Override
public void call(OrderNote orderNote) {
mOrder.getNotes().add(orderNote);
internalNotesAdapter.setData(mOrder.getNotes());
internalNotesAdapter.notifyDataSetChanged();
mNotesLoadingView.success();
header.setVisibility(View.VISIBLE);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
ErrorMessageAlertDialog.getStandardErrorMessageAlertDialog(getActivity(), "Error Deleting Note");
}
});
}
}