package org.openlmis.core.view.widget;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.design.widget.TextInputLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import org.apache.commons.lang3.StringUtils;
import org.openlmis.core.R;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.view.fragment.BaseDialogFragment;
import org.openlmis.core.view.fragment.ConfirmGenerateLotNumberDialogFragment;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import roboguice.inject.InjectView;
public class AddLotDialogFragment extends BaseDialogFragment {
public static boolean IS_OCCUPIED = false;
@InjectView(R.id.ly_lot_number)
private TextInputLayout lyLotNumber;
@InjectView(R.id.et_lot_number)
private EditText etLotNumber;
@InjectView(R.id.dp_add_new_lot)
private DatePicker datePicker;
@InjectView(R.id.btn_cancel)
private TextView btnCancel;
@InjectView(R.id.btn_complete)
private Button btnComplete;
@InjectView(R.id.tv_expiry_date_warning)
private TextView expiryDateWarning;
@InjectView(R.id.drug_name)
private TextView drugName;
@Getter
private String lotNumber;
@Getter
private String expiryDate;
@Setter
private SingleClickButtonListener listener;
private AddLotWithoutNumberListener addLotWithoutNumberListener;
private BaseLotListView.OnDismissListener onDismissListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_add_lot, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
hideDay();
if (getArguments() != null) {
String drugNameFromArgs = getArguments().getString(Constants.PARAM_STOCK_NAME);
if (drugNameFromArgs != null) {
this.drugName.setVisibility(View.VISIBLE);
this.drugName.setText(drugNameFromArgs);
}
}
btnCancel.setOnClickListener(listener);
btnComplete.setOnClickListener(listener);
this.setCancelable(false);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
private void hideDay() {
if (datePicker == null) {
return;
}
ViewGroup datePickerLayout = (ViewGroup) datePicker.getChildAt(0);
if (datePickerLayout == null) {
return;
}
try {
int dayIdentifier = Resources.getSystem().getIdentifier("day", "id", "android");
ViewGroup pickers = (ViewGroup) datePickerLayout.getChildAt(0);
for (int i = 0; i < pickers.getChildCount(); i++) {
View childView = pickers.getChildAt(i);
if (childView.getId() == dayIdentifier) {
childView.setVisibility(View.GONE);
return;
}
}
} catch (NullPointerException e) {
new LMISException(e).reportToFabric();
}
}
public boolean validate() {
clearErrorMessage();
Date enteredDate = DateUtil.getActualMaximumDate(new GregorianCalendar(datePicker.getYear(), datePicker.getMonth(), 1).getTime());
expiryDate = DateUtil.formatDate(enteredDate, DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR);
if (StringUtils.isBlank(etLotNumber.getText().toString())) {
showConfirmNoLotNumberDialog();
return false;
}
lotNumber = etLotNumber.getText().toString().trim().toUpperCase();
return true;
}
private void showConfirmNoLotNumberDialog() {
Bundle bundle = new Bundle();
bundle.putString(Constants.PARAM_MSG_CONFIRM_GENERATE_LOT_NUMBER, getString(R.string.msg_confirm_empty_lot_number, drugName.getText()));
final ConfirmGenerateLotNumberDialogFragment confirmDialog = new ConfirmGenerateLotNumberDialogFragment();
confirmDialog.setArguments(bundle);
confirmDialog.setPositiveClickListener(new SingleClickButtonListener() {
@Override
public void onSingleClick(View v) {
confirmDialog.dismiss();
addLotWithoutNumberListener.addLotWithoutNumber(expiryDate);
AddLotDialogFragment.this.dismiss();
}
});
confirmDialog.show(getFragmentManager(), "confirm generate lot number");
}
private void clearErrorMessage() {
lyLotNumber.setErrorEnabled(false);
expiryDateWarning.setVisibility(View.GONE);
}
public boolean hasIdenticalLot(List<String> existingLots) {
if (existingLots.contains(etLotNumber.getText().toString().toUpperCase())) {
lyLotNumber.setError(getResources().getString(R.string.error_lot_already_exists));
etLotNumber.getBackground().setColorFilter(getResources().getColor(R.color.color_red), PorterDuff.Mode.SRC_ATOP);
return true;
}
return false;
}
public void setAddLotWithoutNumberListener(AddLotWithoutNumberListener addLotWithoutNumberListener) {
this.addLotWithoutNumberListener = addLotWithoutNumberListener;
}
public void setOnDismissListener(BaseLotListView.OnDismissListener onDismissListener) {
this.onDismissListener = onDismissListener;
}
public interface AddLotWithoutNumberListener {
void addLotWithoutNumber(String expiryDate);
}
@Override
public void onDismiss(DialogInterface dialog) {
if (onDismissListener != null) {
onDismissListener.onDismissAction();
}
IS_OCCUPIED = false;
super.onDismiss(dialog);
}
}