/*
* Copyright (C) 2016 Glucosio Foundation
*
* This file is part of Glucosio.
*
* Glucosio is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* Glucosio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Glucosio. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
package org.glucosio.android.presenter;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.google.firebase.crash.FirebaseCrash;
import org.glucosio.android.activity.AddGlucoseActivity;
import org.glucosio.android.db.DatabaseHandler;
import org.glucosio.android.db.GlucoseReading;
import org.glucosio.android.tools.GlucosioConverter;
import org.glucosio.android.tools.ReadingTools;
import org.glucosio.android.tools.SplitDateTime;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class AddGlucosePresenter extends AddReadingPresenter {
private static final int UNKNOWN_ID = -1;
private DatabaseHandler dB;
private AddGlucoseActivity activity;
private ReadingTools rTools;
public AddGlucosePresenter(AddGlucoseActivity addGlucoseActivity) {
this.activity = addGlucoseActivity;
dB = new DatabaseHandler(addGlucoseActivity.getApplicationContext());
rTools = new ReadingTools();
}
public void updateSpinnerTypeTime() {
setReadingTimeNow();
activity.updateSpinnerTypeTime(timeToSpinnerType());
}
private int timeToSpinnerType() {
DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date formatted = Calendar.getInstance().getTime();
SplitDateTime addSplitDateTime = new SplitDateTime(formatted, inputFormat);
int hour = Integer.parseInt(addSplitDateTime.getHour());
return hourToSpinnerType(hour);
}
public int hourToSpinnerType(int hour) {
return rTools.hourToSpinnerType(hour);
}
public void dialogOnAddButtonPressed(String time, String date, String reading, String type, String notes) {
dialogOnAddButtonPressed(time, date, reading, type, notes, UNKNOWN_ID);
}
public void dialogOnAddButtonPressed(String time, String date, String reading, String type, String notes, long oldId) {
if (validateDate(date) && validateTime(time) && validateGlucose(reading) && validateType(type)) {
Date finalDateTime = getReadingTime();
Number number = ReadingTools.parseReading(reading);
if (number == null) {
activity.showErrorMessage();
} else {
boolean isReadingAdded = createReading(type, notes, oldId, finalDateTime, number);
if (!isReadingAdded) {
activity.showDuplicateErrorMessage();
} else {
activity.finishActivity();
}
}
} else {
activity.showErrorMessage();
}
}
private boolean createReading(String type, String notes, long oldId, Date finalDateTime, Number number) {
boolean isReadingAdded;
int readingValue;
if ("mg/dL".equals(getUnitMeasuerement())) {
readingValue = number.intValue();
} else {
readingValue = GlucosioConverter.glucoseToMgDl(number.doubleValue());
}
GlucoseReading gReading = new GlucoseReading(readingValue, type, finalDateTime, notes);
if (oldId == UNKNOWN_ID) {
isReadingAdded = dB.addGlucoseReading(gReading);
} else {
isReadingAdded = dB.editGlucoseReading(oldId, gReading);
}
return isReadingAdded;
}
public Integer retrieveSpinnerID(String measuredTypeText, List<String> measuredTypelist) {
int measuredId = 0;
boolean isFound = false;
for (String measuredType : measuredTypelist) {
if (measuredType.equals(measuredTypeText)) {
isFound = true;
break;
}
measuredId++;
}
// if type is not found, it's return null
return isFound ? measuredId : null;
}
public String getUnitMeasuerement() {
return dB.getUser(1).getPreferred_unit();
}
public GlucoseReading getGlucoseReadingById(Long id) {
return dB.getGlucoseReadingById(id);
}
// Validator
private boolean validateGlucose(String reading) {
if (validateText(reading)) {
if ("mg/dL".equals(getUnitMeasuerement())) {
// We store data in db in mg/dl
try {
Integer readingValue = Integer.parseInt(reading);
//TODO: Add custom ranges
return readingValue > 19 && readingValue < 601;
} catch (Exception e) {
FirebaseCrash.log("Exception during reading validation");
FirebaseCrash.report(e);
return false;
}
} else if ("mmol/L".equals(getUnitMeasuerement())) {
// Convert mmol/L Unit
try {
Double readingValue = Double.parseDouble(reading);
return readingValue > 1.0545 && readingValue < 33.3555;
} catch (Exception e) {
FirebaseCrash.log("Exception during reading validation");
FirebaseCrash.report(e);
return false;
}
} else {
// IT return always true: we don't have ranges yet.
return true;
}
} else {
return false;
}
}
public boolean isFreeStyleLibreEnabled() {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(activity.getApplicationContext());
return sharedPref.getBoolean("pref_freestyle_libre", false);
}
private boolean validateType(String type) {
return validateText(type);
}
}