package com.brew.brewshop.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.brew.brewshop.FragmentHandler;
import com.brew.brewshop.R;
import com.brew.brewshop.settings.Settings;
import com.brew.brewshop.storage.BrewStorage;
import com.brew.brewshop.storage.NameableAdapter;
import com.brew.brewshop.storage.recipes.BeerStyle;
import com.brew.brewshop.storage.recipes.Recipe;
import com.brew.brewshop.storage.style.BjcpCategory;
import com.brew.brewshop.storage.style.BjcpCategoryList;
import com.brew.brewshop.storage.style.BjcpCategoryStorage;
import com.brew.brewshop.storage.style.BjcpGuidelines;
import com.brew.brewshop.storage.style.BjcpSubcategory;
import com.brew.brewshop.storage.style.CommercialExample;
import com.brew.brewshop.storage.style.VitalStatistics;
import com.brew.brewshop.util.UnitConverter;
import com.brew.brewshop.util.Util;
import java.util.List;
public class RecipeStatsFragment extends Fragment implements AdapterView.OnItemSelectedListener {
@SuppressWarnings("unused")
private static final String TAG = RecipeStatsFragment.class.getName();
private static final String RECIPE = "Recipe";
private Recipe mRecipe;
private BrewStorage mStorage;
private ViewGroup mSubstyleLayout;
private EditText mRecipeName;
private Spinner mStyle;
private Spinner mSubstyle;
private EditText mBatchVolume;
private EditText mBoilVolume;
private EditText mBoilTime;
private EditText mEfficiency;
private TextView mDescription;
private BjcpCategoryList mBjcpCategoryList;
private FragmentHandler mViewSwitcher;
private Settings mSettings;
private UnitConverter mConverter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
mSettings = new Settings(getActivity());
mConverter = new UnitConverter(getActivity());
View root = inflater.inflate(R.layout.fragment_edit_recipe_stats, container, false);
setHasOptionsMenu(true);
mStorage = new BrewStorage(getActivity());
if (state != null) {
mRecipe = state.getParcelable(RECIPE);
}
if (mRecipe != null) {
mRecipeName = (EditText) root.findViewById(R.id.recipe_name);
mRecipeName.setText(mRecipe.getName());
mDescription = (TextView) root.findViewById(R.id.description);
mBjcpCategoryList = new BjcpCategoryStorage(getActivity()).getStyles();
mStyle = (Spinner) root.findViewById(R.id.recipe_style);
NameableAdapter styleAdapter = new NameableAdapter(getActivity(), mBjcpCategoryList);
mStyle.setAdapter(styleAdapter);
mStyle.setOnItemSelectedListener(this);
mSubstyle = (Spinner) root.findViewById(R.id.recipe_substyle);
mSubstyle.setOnItemSelectedListener(this);
setSubstyleList(mBjcpCategoryList.get(0).getSubcategories());
mSubstyleLayout = (ViewGroup) root.findViewById(R.id.substyle_layout);
setStyle(mRecipe.getStyle());
TextView batchUnits = (TextView) root.findViewById(R.id.batch_units);
TextView boilUnits = (TextView) root.findViewById(R.id.boil_units);
switch (mSettings.getUnits()) {
case IMPERIAL:
batchUnits.setText(getString(R.string.gallon_abbrev));
boilUnits.setText(getString(R.string.gallon_abbrev));
break;
case METRIC:
batchUnits.setText(getString(R.string.litres));
boilUnits.setText(getString(R.string.litres));
break;
}
mBatchVolume = (EditText) root.findViewById(R.id.batch_volume);
mBatchVolume.setText(mConverter.fromGallons(mRecipe.getBatchVolume(), 5));
mBoilVolume = (EditText) root.findViewById(R.id.boil_volume);
mBoilVolume.setText(mConverter.fromGallons(mRecipe.getBoilVolume(), 5));
mBoilTime = (EditText) root.findViewById(R.id.boil_time);
mBoilTime.setText(Util.fromDouble(mRecipe.getBoilTime(), 0));
mEfficiency = (EditText) root.findViewById(R.id.efficiency);
mEfficiency.setText(Util.fromDouble(mRecipe.getEfficiency(), 5));
}
mViewSwitcher.setTitle(getActivity().getResources().getString(R.string.edit_recipe_stats));
root.findViewById(R.id.root_view).requestFocus();
return root;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mViewSwitcher = (FragmentHandler) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement " + FragmentHandler.class.getName());
}
}
private void setSubstyleList(List<BjcpSubcategory> subcategories) {
NameableAdapter substyleAdapter = new NameableAdapter(getActivity(), subcategories);
mSubstyle.setAdapter(substyleAdapter);
}
private void setStyle(BeerStyle style) {
BjcpCategory category = mBjcpCategoryList.findByName(style.getStyleName());
int index = mBjcpCategoryList.indexOf(category);
if (index < 0 ) {
mStyle.setSelection(0);
mSubstyle.setSelection(0);
} else {
mStyle.setSelection(index);
setSubstyleList(category.getSubcategories());
int substyleIdx = category.findSubcategoryIdx(style.getSubstyleName());
if (substyleIdx < 0 ) {
mSubstyle.setSelection(0);
} else {
mSubstyle.setSelection(substyleIdx);
}
}
mDescription.setText(style.getDescription());
}
@Override
public void onPause() {
super.onPause();
String name = mRecipeName.getText().toString();
if (name.length() == 0) {
name = getActivity().getResources().getString(R.string.unnamed_recipe);
}
mRecipe.setName(name);
double mBatchVolumeGallons = mConverter.toGallons(mBatchVolume.getText());
if (mBatchVolumeGallons > 0) {
mRecipe.setBatchVolume(mBatchVolumeGallons);
}
mRecipe.setBoilVolume(mConverter.toGallons(mBoilVolume.getText()));
mRecipe.setBoilTime(Util.toDouble(mBoilTime.getText()));
double efficiency = Util.toDouble(mEfficiency.getText());
if (efficiency > 100) {
efficiency = 100;
}
mRecipe.setEfficiency(efficiency);
BeerStyle style = mRecipe.getStyle();
VitalStatistics stats = getVitalStatistics();
style.setOgMin(stats.getOgMin());
style.setOgMax(stats.getOgMax());
style.setFgMin(stats.getFgMin());
style.setFgMax(stats.getFgMax());
style.setIbuMin(stats.getIbuMin());
style.setIbuMax(stats.getIbuMax());
style.setSrmMin(stats.getSrmMin());
style.setSrmMax(stats.getSrmMax());
style.setAbvMin(stats.getAbvMin());
style.setAbvMax(stats.getAbvMax());
style.setDescription(mDescription.getText().toString());
mStorage.updateRecipe(mRecipe);
Util.hideKeyboard(getActivity());
}
private VitalStatistics getVitalStatistics() {
BjcpCategory category = (BjcpCategory) mStyle.getSelectedItem();
if (category.getSubcategories() == null || category.getSubcategories().isEmpty()) {
return category.getGuidelines().getVitalStatistics();
} else {
BjcpSubcategory subcategory = (BjcpSubcategory) mSubstyle.getSelectedItem();
return subcategory.getGuidelines().getVitalStatistics();
}
}
@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);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.empty_menu, menu);
}
public void setRecipe(Recipe recipe) {
mRecipe = recipe;
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
switch (adapterView.getId()) {
case R.id.recipe_style:
BjcpCategory category = (BjcpCategory) mStyle.getSelectedItem();
if (category.getName().equals(mRecipe.getStyle().getStyleName())) {
if (category.getSubcategories().isEmpty()) {
mSubstyleLayout.setVisibility(View.GONE);
}
} else {
mRecipe.getStyle().setStyleName(category.getName());
if (category.getSubcategories().isEmpty()) {
mRecipe.getStyle().setSubstyleName("");
mSubstyleLayout.setVisibility(View.GONE);
setDescription();
} else {
mSubstyleLayout.setVisibility(View.VISIBLE);
setSubstyleList(category.getSubcategories());
mSubstyle.setSelection(0);
}
}
break;
case R.id.recipe_substyle:
BjcpSubcategory subcategory = (BjcpSubcategory) mSubstyle.getSelectedItem();
mRecipe.getStyle().setSubstyleName(subcategory.getName());
setDescription();
break;
}
}
private void setDescription() {
BjcpCategory category = (BjcpCategory) mStyle.getSelectedItem();
StringBuilder description = new StringBuilder();
description.append(getActivity().getResources().getString(R.string.bjcp_category) + " " + category.getId());
BjcpGuidelines guidelines = category.getGuidelines();
List<CommercialExample> examples = category.getCommercialExamples();
if (category.getSubcategories() != null && !category.getSubcategories().isEmpty()) {
BjcpSubcategory subcategory = (BjcpSubcategory) mSubstyle.getSelectedItem();
description.append(subcategory.getLetter());
guidelines = subcategory.getGuidelines();
examples = subcategory.getCommercialExamples();
}
description.append("\n\n");
description.append("AROMA" + "\n\n" + guidelines.getAroma() + "\n\n");
description.append("APPEARANCE" + "\n\n" + guidelines.getAppearance() + "\n\n");
description.append("FLAVOR" + "\n\n" + guidelines.getFlavor() + "\n\n");
description.append("MOUTHFEEL" + "\n\n" + guidelines.getMouthfeel() + "\n\n");
description.append("OVERALL IMPRESSION" + "\n\n" + guidelines.getOverallImpression() + "\n\n");
description.append("COMMENTS" + "\n\n" + guidelines.getComments() + "\n\n");
description.append("INGREDIENTS" + "\n\n" + guidelines.getIngredients() + "\n\n");
description.append("COMMERCIAL EXAMPLES" + "\n\n");
StringBuilder examplesBuilder = new StringBuilder();
for (CommercialExample example : examples) {
examplesBuilder.append("- " + example.getName() + "\n");
}
mDescription.setText(Util.separateSentences(description.toString()) + examplesBuilder.toString());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}