package org.openlmis.core.view.widget;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.manager.MovementReasonManager;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.ToastUtil;
import org.openlmis.core.view.adapter.LotMovementAdapter;
import org.openlmis.core.view.viewmodel.BaseStockMovementViewModel;
import org.openlmis.core.view.viewmodel.LotMovementViewModel;
import org.roboguice.shaded.goole.common.base.Function;
import org.roboguice.shaded.goole.common.collect.FluentIterable;
import java.util.ArrayList;
import java.util.List;
import lombok.Setter;
import roboguice.RoboGuice;
import roboguice.inject.InjectView;
public class BaseLotListView extends FrameLayout {
public static final String ADD_LOT = "add_new_lot";
protected Context context;
@InjectView(R.id.ly_action_panel)
protected View actionPanel;
@InjectView(R.id.btn_add_new_lot)
protected TextView btnAddNewLot;
@InjectView(R.id.rv_new_lot_list)
protected RecyclerView newLotListView;
@InjectView(R.id.rv_existing_lot_list)
protected RecyclerView existingLotListView;
protected AddLotDialogFragment addLotDialogFragment;
protected LotMovementAdapter newLotMovementAdapter;
protected LotMovementAdapter existingLotMovementAdapter;
@Setter
protected BaseStockMovementViewModel viewModel;
public BaseLotListView(Context context) {
super(context);
}
public BaseLotListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
protected void init(Context context) {
this.context = context;
inflateLayout(context);
RoboGuice.injectMembers(getContext(), this);
RoboGuice.getInjector(getContext()).injectViewMembers(this);
}
protected void inflateLayout(Context context) {
inflate(context, R.layout.view_lot_list, this);
}
public void initLotListView(BaseStockMovementViewModel viewModel) {
this.viewModel = viewModel;
initExistingLotListView();
initNewLotListView();
btnAddNewLot.setOnClickListener(getAddNewLotOnClickListener());
}
public void initExistingLotListView() {
existingLotListView.setLayoutManager(new LinearLayoutManager(getContext()));
existingLotMovementAdapter = new LotMovementAdapter(viewModel.getExistingLotMovementViewModelList());
existingLotListView.setAdapter(existingLotMovementAdapter);
}
public void initNewLotListView() {
newLotListView.setLayoutManager(new LinearLayoutManager(getContext()));
newLotMovementAdapter = new LotMovementAdapter(viewModel.getNewLotMovementViewModelList(), viewModel.getProduct().getProductNameWithCodeAndStrength());
newLotListView.setAdapter(newLotMovementAdapter);
}
public void setActionAddNewEnabled(boolean actionAddNewEnabled) {
btnAddNewLot.setEnabled(actionAddNewEnabled);
}
public void refreshNewLotList() {
newLotMovementAdapter.notifyDataSetChanged();
}
public void addNewLot(LotMovementViewModel lotMovementViewModel) {
viewModel.getNewLotMovementViewModelList().add(lotMovementViewModel);
refreshNewLotList();
}
public AddLotDialogFragment.AddLotWithoutNumberListener getAddLotWithoutNumberListener() {
return new AddLotDialogFragment.AddLotWithoutNumberListener() {
@Override
public void addLotWithoutNumber(String expiryDate) {
btnAddNewLot.setEnabled(true);
String lotNumber = LotMovementViewModel.generateLotNumberForProductWithoutLot(viewModel.getProduct().getCode(), expiryDate);
if (getLotNumbers().contains(lotNumber)) {
ToastUtil.show(LMISApp.getContext().getString(R.string.error_lot_without_number_already_exists));
} else {
addNewLot(new LotMovementViewModel(lotNumber, expiryDate, MovementReasonManager.MovementType.PHYSICAL_INVENTORY));
}
}
};
}
@NonNull
public List<String> getLotNumbers() {
final List<String> existingLots = new ArrayList<>();
existingLots.addAll(FluentIterable.from(viewModel.getNewLotMovementViewModelList()).transform(new Function<LotMovementViewModel, String>() {
@Override
public String apply(LotMovementViewModel lotMovementViewModel) {
return lotMovementViewModel.getLotNumber();
}
}).toList());
existingLots.addAll(FluentIterable.from(viewModel.getExistingLotMovementViewModelList()).transform(new Function<LotMovementViewModel, String>() {
@Override
public String apply(LotMovementViewModel lotMovementViewModel) {
return lotMovementViewModel.getLotNumber();
}
}).toList());
return existingLots;
}
@NonNull
public SingleClickButtonListener getAddNewLotOnClickListener() {
return new SingleClickButtonListener() {
@Override
public void onSingleClick(View v) {
showAddLotDialogFragment();
}
};
}
public boolean showAddLotDialogFragment() {
if (!AddLotDialogFragment.IS_OCCUPIED) {
AddLotDialogFragment.IS_OCCUPIED = true;
Bundle bundle = new Bundle();
bundle.putString(Constants.PARAM_STOCK_NAME, viewModel.getProduct().getFormattedProductName());
addLotDialogFragment = new AddLotDialogFragment();
addLotDialogFragment.setArguments(bundle);
addLotDialogFragment.setListener(getAddNewLotDialogOnClickListener());
addLotDialogFragment.setOnDismissListener(getOnAddNewLotDialogDismissListener());
addLotDialogFragment.setAddLotWithoutNumberListener(getAddLotWithoutNumberListener());
addLotDialogFragment.show(((Activity) context).getFragmentManager(), ADD_LOT);
return true;
}
return false;
}
@NonNull
public OnDismissListener getOnAddNewLotDialogDismissListener() {
return new OnDismissListener() {
@Override
public void onDismissAction() {
setActionAddNewEnabled(true);
}
};
}
@NonNull
protected SingleClickButtonListener getAddNewLotDialogOnClickListener() {
return new SingleClickButtonListener() {
@Override
public void onSingleClick(View v) {
switch (v.getId()) {
case R.id.btn_complete:
if (addLotDialogFragment.validate() && !addLotDialogFragment.hasIdenticalLot(getLotNumbers())) {
addNewLot(new LotMovementViewModel(addLotDialogFragment.getLotNumber(), addLotDialogFragment.getExpiryDate(), viewModel.getMovementType()));
addLotDialogFragment.dismiss();
}
break;
case R.id.btn_cancel:
addLotDialogFragment.dismiss();
break;
}
}
};
}
public interface OnDismissListener {
void onDismissAction();
}
}