package com.brew.brewshop.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.brew.brewshop.R;
import com.brew.brewshop.settings.Settings;
import com.brew.brewshop.storage.BrewStorage;
import com.brew.brewshop.storage.Nameable;
import com.brew.brewshop.storage.inventory.InventoryItem;
import com.brew.brewshop.storage.inventory.InventoryList;
import com.brew.brewshop.storage.recipes.Recipe;
import com.brew.brewshop.storage.recipes.Yeast;
import com.brew.brewshop.storage.yeast.YeastInfo;
import com.brew.brewshop.storage.yeast.YeastInfoList;
import com.brew.brewshop.storage.yeast.YeastStorage;
import com.brew.brewshop.util.Util;
import com.brew.brewshop.widgets.IngredientSelectionHandler;
import com.brew.brewshop.widgets.IngredientSpinner;
public class YeastFragment extends Fragment implements IngredientSelectionHandler {
@SuppressWarnings("unused")
private static final String TAG = YeastFragment.class.getName();
private static final String RECIPE = "Recipe";
private static final String INVENTORY_ITEM = "InventoryItem";
private static final String YEAST_INDEX = "YeastIndex";
private Recipe mRecipe;
private InventoryItem mInventoryItem;
private YeastInfoList mYeastInfoList;
private BrewStorage mStorage;
private int mYeastIndex;
private IngredientSpinner<YeastInfo> mIngredientSpinner;
private Settings mSettings;
private TextView mDescription;
private EditText mAttenuationEdit;
private EditText mCustomName;
private EditText mQuantityEdit;
private View mCustomNameView;
private View mDescriptionView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
View root = inflater.inflate(R.layout.fragment_edit_yeast, container, false);
mAttenuationEdit = (EditText) root.findViewById(R.id.yeast_attenuation);
mDescription = (TextView) root.findViewById(R.id.description);
mCustomName = (EditText) root.findViewById(R.id.custom_name);
mQuantityEdit = (EditText) root.findViewById(R.id.yeast_quantity);
mCustomNameView = root.findViewById(R.id.custom_malt_layout);
mDescriptionView = root.findViewById(R.id.description_layout);
mSettings = new Settings(getActivity());
mStorage = new BrewStorage(getActivity());
mYeastInfoList = new YeastStorage(getActivity()).getYeast();
if (state != null) {
mRecipe = state.getParcelable(RECIPE);
mYeastIndex = state.getInt(YEAST_INDEX, -1);
mInventoryItem = state.getParcelable(INVENTORY_ITEM);
}
Spinner spinner = (Spinner) root.findViewById(R.id.yeast_type);
TextView inventoryOnly = (TextView) root.findViewById(R.id.showing_inventory_only);
mIngredientSpinner = new IngredientSpinner<YeastInfo>(getActivity(), spinner, inventoryOnly, this);
if (mInventoryItem != null) {
populateItemData(root);
} else if (mRecipe != null && mYeastIndex >= 0) {
populateRecipeYeastData();
}
ActionBar bar = ((ActionBarActivity) getActivity()).getSupportActionBar();
if (bar != null) {
bar.setTitle(getActivity().getResources().getString(R.string.edit_yeast_addition));
}
root.findViewById(R.id.root_view).requestFocus();
setHasOptionsMenu(true);
return root;
}
@Override
public void onPause() {
super.onPause();
retrieveUserInputData();
if (mRecipe != null) {
mStorage.updateRecipe(mRecipe);
} else if (mInventoryItem != null) {
mStorage.updateInventoryItem(mInventoryItem);
}
Util.hideKeyboard(getActivity());
}
@Override
public void onDestroyView() {
super.onDestroyView();
mStorage.close();
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
if (state == null) {
state = new Bundle();
}
state.putParcelable(RECIPE, mRecipe);
state.putInt(YEAST_INDEX, mYeastIndex);
state.putParcelable(INVENTORY_ITEM, mInventoryItem);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.edit_ingredient_menu, menu);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (mInventoryItem != null || getInventory().isEmpty()) {
menu.findItem(R.id.action_show_all).setVisible(false);
menu.findItem(R.id.action_show_inventory).setVisible(false);
} else {
boolean show = mIngredientSpinner.isInventoryShowable(getInventory(), getYeast());
menu.findItem(R.id.action_show_all).setVisible(show);
menu.findItem(R.id.action_show_inventory).setVisible(!show);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
retrieveUserInputData();
switch (menuItem.getItemId()) {
case R.id.action_show_all:
mSettings.setShowInventoryInIngredientEdit(false);
getActivity().supportInvalidateOptionsMenu();
mIngredientSpinner.showAllIngredientOptions(mYeastInfoList, R.string.custom_yeast);
setYeastInfo(1);
return true;
case R.id.action_show_inventory:
mSettings.setShowInventoryInIngredientEdit(true);
getActivity().supportInvalidateOptionsMenu();
mIngredientSpinner.showInventoryOnly(getInventory());
setInventoryYeastInfo(0);
return true;
}
return super.onOptionsItemSelected(menuItem);
}
@Override
public boolean checkCustomOptionSelected(Nameable item) {
boolean handled = false;
String customName = getActivity().getResources().getString(R.string.custom_yeast);
if (item.getName().equals(customName)) {
if (!mCustomName.getText().toString().equals(getYeast().getName())) {
mCustomName.setText("");
mAttenuationEdit.setText("0");
}
mCustomNameView.setVisibility(View.VISIBLE);
mDescriptionView.setVisibility(View.GONE);
handled = true;
} else {
mCustomNameView.setVisibility(View.GONE);
mDescriptionView.setVisibility(View.VISIBLE);
}
return handled;
}
@Override
public void onDefinedTypeSelected(Nameable item) {
YeastInfo info = (YeastInfo) item;
if (!info.getName().equals(getYeast().getName())) {
getYeast().setName(info.getName());
mAttenuationEdit.setText(Util.fromDouble(getAttenuation(info), 3));
}
setDescription(info);
}
@Override
public void onInventoryItemSelected(InventoryItem item) {
if (!item.getName().equals(getYeast().getName())) {
getYeast().setName(item.getName());
mAttenuationEdit.setText(Util.fromDouble(item.getYeast().getAttenuation(), 3));
mQuantityEdit.setText(Util.fromDouble(item.getCount(), 1));
}
YeastInfo info = mYeastInfoList.findByName(item.getName());
setDescription(info);
}
public void setRecipe(Recipe recipe) {
mRecipe = recipe;
}
public void setYeastIndex(int index) {
mYeastIndex = index;
}
public void setInventoryItem(InventoryItem item) {
mInventoryItem = item;
}
private void setDescription(YeastInfo info) {
if (info == null || info.getDescription().length() == 0) {
mDescription.setTextColor(getActivity().getResources().getColor(R.color.text_dark_secondary));
mDescription.setText(getActivity().getResources().getString(R.string.no_description));
} else {
mDescription.setTextColor(getActivity().getResources().getColor(R.color.text_dark_primary));
mDescription.setText(Util.separateSentences(info.getDescription()));
}
}
private InventoryList getInventory() {
return mStorage.retrieveInventory().getYeasts();
}
private void retrieveUserInputData() {
if (mRecipe != null) {
Yeast yeast = mRecipe.getYeast().get(mYeastIndex);
getYeastData(yeast);
} else if (mInventoryItem != null) {
Yeast yeast = mInventoryItem.getYeast();
getYeastData(yeast);
mInventoryItem.setCount(Util.toDouble(mQuantityEdit.getText()));
}
}
private void populateItemData(View view) {
TextView title = (TextView) view.findViewById(R.id.yeast_addition_title);
title.setText(getResources().getString(R.string.inventory_yeast));
view.findViewById(R.id.yeast_quantity_layout).setVisibility(View.VISIBLE);
mIngredientSpinner.showAllIngredientOptions(mYeastInfoList, R.string.custom_yeast);
mQuantityEdit.setText(Util.fromDouble(mInventoryItem.getCount(), 1));
setYeastInfo(1);
}
private void populateRecipeYeastData() {
mIngredientSpinner.showOptions(getInventory(), getYeast(), mYeastInfoList, R.string.custom_yeast);
if (mIngredientSpinner.isInventoryShowable(getInventory(), getYeast())) {
setInventoryYeastInfo(0);
} else {
setYeastInfo(1);
}
}
private void getYeastData(Yeast yeast) {
Nameable selectedYeast = mIngredientSpinner.getSelectedItem();
double attenuation = Util.toDouble(mAttenuationEdit.getText());
if (attenuation > 100) {
attenuation = 100;
}
mIngredientSpinner.setNamedItem(selectedYeast, yeast, mCustomName.getText().toString());
yeast.setAttenuation(attenuation);
}
private void setYeastInfo(int offset) {
YeastInfo info = mYeastInfoList.findByName(getYeast().getName());
int index = mYeastInfoList.indexOf(info);
setYeastInfoFromIndex(index, offset);
}
private void setInventoryYeastInfo(int offset) {
int index = getInventory().indexOf(getYeast());
if (index < 0) index = 0; //Prevent custom name view from showing
setYeastInfoFromIndex(index, offset);
}
private void setYeastInfoFromIndex(int index, int offset) {
Yeast yeast = getYeast();
if (index < 0 ) {
mCustomName.setText(yeast.getName());
mCustomNameView.setVisibility(View.VISIBLE);
mDescriptionView.setVisibility(View.GONE);
mIngredientSpinner.setSelection(0);
} else {
mIngredientSpinner.setSelection(index + offset);
mCustomNameView.setVisibility(View.GONE);
mDescriptionView.setVisibility(View.VISIBLE);
}
mAttenuationEdit.setText(Util.fromDouble(yeast.getAttenuation(), 3));
}
private double getAttenuation(YeastInfo info) {
return (info.getAttenuationMax() + info.getAttenuationMin()) / 2;
}
private Yeast getYeast() {
Yeast yeast = null;
if (mRecipe != null) {
yeast = mRecipe.getYeast().get(mYeastIndex);
} else if (mInventoryItem != null) {
yeast = mInventoryItem.getYeast();
}
return yeast;
}
}