package org.openlmis.core.view.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import org.openlmis.core.R;
import org.openlmis.core.manager.MovementReasonManager;
import org.openlmis.core.utils.ToastUtil;
import org.openlmis.core.view.adapter.LotMovementAdapter;
import org.openlmis.core.view.adapter.NewMovementLotMovementAdapter;
import org.openlmis.core.view.viewmodel.BaseStockMovementViewModel;
import org.openlmis.core.view.viewmodel.LotMovementViewModel;
import org.openlmis.core.view.viewmodel.StockMovementViewModel;
import roboguice.inject.InjectView;
public class NewMovementLotListView extends MovementChangeLotListView {
@InjectView(R.id.alert_add_positive_lot_amount)
ViewGroup alertAddPositiveLotAmount;
@InjectView(R.id.alert_soonest_expire)
ViewGroup alertSoonestExpire;
public NewMovementLotListView(Context context) {
super(context);
}
public NewMovementLotListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void initLotListView(BaseStockMovementViewModel viewModel) {
this.viewModel = viewModel;
movementChangedListener = getMovementChangedListener();
if (MovementReasonManager.MovementType.RECEIVE.equals(viewModel.getMovementType())
|| MovementReasonManager.MovementType.POSITIVE_ADJUST.equals(viewModel.getMovementType())) {
setActionAddNewLotVisibility(View.VISIBLE);
setActionAddNewLotListener(getAddNewLotOnClickListener());
} else {
setActionAddNewLotVisibility(GONE);
}
initExistingLotListView();
initNewLotListView();
initLotErrorBanner();
}
public void addNewLot(LotMovementViewModel lotMovementViewModel) {
super.addNewLot(lotMovementViewModel);
updateAddPositiveLotAmountAlert();
}
@NonNull
protected LotMovementAdapter.MovementChangedListener getMovementChangedListener() {
return new LotMovementAdapter.MovementChangedListener() {
@Override
public void movementChange() {
updateAddPositiveLotAmountAlert();
updateSoonestToExpireNotIssuedBanner();
}
};
}
@Override
public void initExistingLotListView() {
existingLotListView.setLayoutManager(new LinearLayoutManager(getContext()));
existingLotMovementAdapter = new NewMovementLotMovementAdapter(viewModel.getExistingLotMovementViewModelList());
existingLotListView.setAdapter(existingLotMovementAdapter);
existingLotMovementAdapter.setMovementChangeListener(movementChangedListener);
}
@Override
public void initNewLotListView() {
newLotListView.setLayoutManager(new LinearLayoutManager(getContext()));
newLotMovementAdapter = new NewMovementLotMovementAdapter(viewModel.getNewLotMovementViewModelList(), viewModel.getProduct().getProductNameWithCodeAndStrength());
newLotListView.setAdapter(newLotMovementAdapter);
newLotMovementAdapter.setMovementChangeListener(movementChangedListener);
}
private void updateAddPositiveLotAmountAlert() {
if (!((StockMovementViewModel) viewModel).movementQuantitiesExist()) {
alertAddPositiveLotAmount.setVisibility(View.VISIBLE);
} else {
alertAddPositiveLotAmount.setVisibility(View.GONE);
}
}
private void updateSoonestToExpireNotIssuedBanner() {
alertSoonestExpire.setVisibility(viewModel.getMovementType() == MovementReasonManager.MovementType.ISSUE && !((StockMovementViewModel) viewModel).validateSoonestToExpireLotsIssued() ? View.VISIBLE : View.GONE);
}
public void setActionAddNewLotVisibility(int visibility) {
actionPanel.setVisibility(visibility);
}
public void setActionAddNewLotListener(OnClickListener addNewLotOnClickListener) {
btnAddNewLot.setOnClickListener(addNewLotOnClickListener);
}
public void initLotErrorBanner() {
if (((StockMovementViewModel) viewModel).hasLotDataChanged()) {
updateAddPositiveLotAmountAlert();
}
}
public void refresh() {
existingLotMovementAdapter.notifyDataSetChanged();
newLotMovementAdapter.notifyDataSetChanged();
}
public void setAlertAddPositiveLotAmountVisibility(int visibility) {
alertAddPositiveLotAmount.setVisibility(visibility);
}
public boolean validateLotListWithValidValues() {
int position1 = ((NewMovementLotMovementAdapter) existingLotMovementAdapter).validateLotQuantityNotGreaterThanSOH();
if (position1 >= 0) {
existingLotListView.scrollToPosition(position1);
return false;
}
int position2 = ((NewMovementLotMovementAdapter) newLotMovementAdapter).validateLotPositiveQuantity();
if (position2 >= 0) {
newLotListView.scrollToPosition(position2);
return false;
}
return true;
}
public boolean validate() {
if (validateLotListNotEmpty() && validateLotListWithValidValues()) {
return true;
}
refresh();
return false;
}
public boolean validateLotListNotEmpty() {
if (((StockMovementViewModel) viewModel).isLotEmpty()) {
ToastUtil.show(getResources().getString(R.string.empty_lot_warning));
return false;
}
if (!((StockMovementViewModel) viewModel).movementQuantitiesExist()) {
setAlertAddPositiveLotAmountVisibility(View.VISIBLE);
return false;
}
return true;
}
}