/*
* 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 org.glucosio.android.R;
import org.glucosio.android.db.CholesterolReading;
import org.glucosio.android.db.DatabaseHandler;
import org.glucosio.android.db.GlucoseReading;
import org.glucosio.android.db.HB1ACReading;
import org.glucosio.android.db.KetoneReading;
import org.glucosio.android.db.PressureReading;
import org.glucosio.android.db.WeightReading;
import org.glucosio.android.object.A1cEstimate;
import org.glucosio.android.object.IntGraphObject;
import org.glucosio.android.tools.GlucosioConverter;
import org.glucosio.android.tools.TipsManager;
import org.glucosio.android.view.OverviewView;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
public class OverviewPresenter {
private DatabaseHandler dB;
private OverviewView view;
private List<Integer> glucoseReadingsWeek;
private List<Integer> glucoseReadingsMonth;
private List<String> glucoseDatetimeWeek;
private List<String> glucoseDatetimeMonth;
private List<GlucoseReading> glucoseReadings;
private List<IntGraphObject> glucoseGraphObjects;
private int glucoseMinValue = 0;
private int glucoseMaxValue = 0;
public OverviewPresenter(OverviewView view, DatabaseHandler dB) {
this.dB = dB;
this.view = view;
}
public boolean isdbEmpty() {
return dB.getGlucoseReadings().size() == 0;
}
public void loadDatabase(boolean isNewGraphEnabled) {
this.glucoseReadings = dB.getGlucoseReadings();
this.glucoseGraphObjects = generateGlucoseGraphPoints(isNewGraphEnabled);
this.glucoseReadingsMonth = dB.getAverageGlucoseReadingsByMonth();
this.glucoseReadingsWeek = dB.getAverageGlucoseReadingsByWeek();
this.glucoseDatetimeWeek = dB.getGlucoseDatetimesByWeek();
this.glucoseDatetimeMonth = dB.getGlucoseDatetimesByMonth();
this.glucoseMaxValue = dB.getUser(1).getCustom_range_max();
this.glucoseMinValue = dB.getUser(1).getCustom_range_min();
}
public String convertDate(String date) {
return view.convertDate(date);
}
public String getHB1AC() {
// Check if last month is available first
if (getGlucoseReadingsMonth().size() > 1) {
if ("percentage".equals(dB.getUser(1).getPreferred_unit_a1c())) {
return GlucosioConverter.glucoseToA1C(getGlucoseReadingsMonth().get(getGlucoseReadingsMonth().size() - 2)) + " %";
} else {
return GlucosioConverter.a1cNgspToIfcc(GlucosioConverter.glucoseToA1C(getGlucoseReadingsMonth().get(getGlucoseReadingsMonth().size() - 2))) + " mmol/mol";
}
} else {
return view.getString(R.string.overview_hb1ac_error_no_data);
}
}
public boolean isA1cAvailable(int depth) {
return getGlucoseReadingsMonth().size() > depth;
}
public ArrayList<A1cEstimate> getA1cEstimateList() {
ArrayList<A1cEstimate> a1cEstimateList = new ArrayList<>();
// We don't take this month because A1C is incomplete
for (int i = 0; i < getGlucoseReadingsMonth().size() - 1; i++) {
double value = GlucosioConverter.glucoseToA1C(getGlucoseReadingsMonth().get(i));
String month = convertDateToMonth(getGlucoseDatetimeMonth().get(i));
a1cEstimateList.add(new A1cEstimate(value, month));
}
Collections.reverse(a1cEstimateList);
return a1cEstimateList;
}
public String getA1cMonth() {
// Check if last month is available first
if (getGlucoseReadingsMonth().size() > 1) {
return convertDateToMonth(getGlucoseDatetimeMonth().get(getGlucoseDatetimeMonth().size() - 2)) + "";
} else {
return " ";
}
}
public String getLastReading() {
return dB.getLastGlucoseReading().getReading() + "";
}
public String getLastDateTime() {
java.text.DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
return inputFormat.format(dB.getLastGlucoseReading().getCreated());
}
public String getRandomTip(TipsManager manager) {
ArrayList<String> tips = manager.getTips();
// Get random tip from array
int randomNumber = new Random().nextInt(tips.size());
return tips.get(randomNumber);
}
public String getUnitMeasuerement() {
return dB.getUser(1).getPreferred_unit();
}
public int getUserAge() {
return dB.getUser(1).getAge();
}
public List<Integer> getGlucoseReadings() {
ArrayList<Integer> glucoseReadings = new ArrayList<>();
for (int i = 0; i < glucoseGraphObjects.size(); i++) {
glucoseReadings.add(glucoseGraphObjects.get(i).getReading());
}
return glucoseReadings;
}
public ArrayList<Double> getA1cReadings() {
final List<HB1ACReading> a1cReadings = dB.getHB1ACReadings();
ArrayList<Double> finalArrayList = new ArrayList<>();
for (int i = 0; i < a1cReadings.size(); i++) {
finalArrayList.add(a1cReadings.get(i).getReading());
}
return finalArrayList;
}
public ArrayList<String> getA1cReadingsDateTime() {
return dB.getHB1ACDateTimeAsArray();
}
public ArrayList<Double> getKetonesReadings() {
final List<KetoneReading> ketoneReadings = dB.getKetoneReadings();
ArrayList<Double> finalArrayList = new ArrayList<>();
for (int i = 0; i < ketoneReadings.size(); i++) {
finalArrayList.add(ketoneReadings.get(i).getReading());
}
return finalArrayList;
}
public ArrayList<String> getKetonesReadingsDateTime() {
return dB.getKetoneDateTimeAsArray();
}
public ArrayList<Integer> getWeightReadings() {
final List<WeightReading> weightReadings = dB.getWeightReadings();
ArrayList<Integer> finalArrayList = new ArrayList<>();
for (int i = 0; i < weightReadings.size(); i++) {
finalArrayList.add(weightReadings.get(i).getReading());
}
return finalArrayList;
}
public ArrayList<String> getWeightReadingsDateTime() {
return dB.getWeightReadingDateTimeAsArray();
}
public ArrayList<Integer> getMinPressureReadings() {
final List<PressureReading> pressureReadings = dB.getPressureReadings();
ArrayList<Integer> finalArrayList = new ArrayList<>();
for (int i = 0; i < pressureReadings.size(); i++) {
finalArrayList.add(pressureReadings.get(i).getMinReading());
}
return finalArrayList;
}
public ArrayList<Integer> getMaxPressureReadings() {
final List<PressureReading> pressureReadings = dB.getPressureReadings();
ArrayList<Integer> finalArrayList = new ArrayList<>();
for (int i = 0; i < pressureReadings.size(); i++) {
finalArrayList.add(pressureReadings.get(i).getMaxReading());
}
return finalArrayList;
}
public ArrayList<String> getPressureReadingsDateTime() {
return dB.getPressureDateTimeAsArray();
}
public ArrayList<Integer> getCholesterolReadings() {
final List<CholesterolReading> cholesterolReadings = dB.getCholesterolReadings();
ArrayList<Integer> finalArrayList = new ArrayList<>();
for (int i = 0; i < cholesterolReadings.size(); i++) {
finalArrayList.add(cholesterolReadings.get(i).getTotalReading());
}
return finalArrayList;
}
public ArrayList<String> getCholesterolReadingsDateTime() {
return dB.getCholesterolDateTimeAsArray();
}
private List<IntGraphObject> generateGlucoseGraphPoints(boolean isNewGraphEnabled) {
final ArrayList<IntGraphObject> finalGraphObjects = new ArrayList<>();
if (isNewGraphEnabled) {
DateTime minDateTime = DateTime.now().minusMonths(1).minusDays(15);
final List<GlucoseReading> glucoseReadings = dB.getLastMonthGlucoseReadings();
Collections.sort(glucoseReadings, new Comparator<GlucoseReading>() {
public int compare(GlucoseReading o1, GlucoseReading o2) {
return o1.getCreated().compareTo(o2.getCreated());
}
});
DateTime startDate = glucoseReadings.size() > 0 ?
minDateTime : DateTime.now();
// Transfer values from database to ArrayList as GlucoseGraphObjects
for (int i = 0; i < glucoseReadings.size(); i++) {
final GlucoseReading reading = glucoseReadings.get(i);
final DateTime createdDate = new DateTime(reading.getCreated());
//add zero values between current value and last added value
addZeroReadings(finalGraphObjects, startDate, createdDate);
//add new value
finalGraphObjects.add(
new IntGraphObject(createdDate, reading.getReading())
);
//update start date
startDate = createdDate;
}
//add last zeros till now
addZeroReadings(finalGraphObjects, startDate, DateTime.now());
} else {
Collections.sort(glucoseReadings, new Comparator<GlucoseReading>() {
public int compare(GlucoseReading o1, GlucoseReading o2) {
return o1.getCreated().compareTo(o2.getCreated());
}
});
for (int i = 0; i < glucoseReadings.size(); i++) {
GlucoseReading glucoseReading = glucoseReadings.get(i);
finalGraphObjects.add(new IntGraphObject(new DateTime(glucoseReading.getCreated()), glucoseReading.getReading()));
}
}
return finalGraphObjects;
}
private void addZeroReadings(final ArrayList<IntGraphObject> graphObjects,
final DateTime firstDate,
final DateTime lastDate) {
int daysBetween = Days.daysBetween(firstDate, lastDate).getDays();
for (int i = 1; i < daysBetween; i++) {
graphObjects.add(new IntGraphObject(firstDate.plusDays(i), 0));
}
}
public ArrayList<String> getGraphGlucoseDateTime() {
ArrayList<String> glucoseDatetime = new ArrayList<>();
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
for (int i = 0; i < glucoseGraphObjects.size(); i++) {
glucoseDatetime.add(dateTimeFormatter.print(glucoseGraphObjects.get(i).getCreated()));
}
return glucoseDatetime;
}
public List<Integer> getGlucoseReadingsWeek() {
return glucoseReadingsWeek;
}
public List<Integer> getGlucoseReadingsMonth() {
return glucoseReadingsMonth;
}
public List<String> getGlucoseDatetimeWeek() {
return glucoseDatetimeWeek;
}
public List<String> getGlucoseDatetimeMonth() {
return glucoseDatetimeMonth;
}
public String convertDateToMonth(String s) {
return view.convertDateToMonth(s);
}
public int getGlucoseMinValue() {
return glucoseMinValue;
}
public int getGlucoseMaxValue() {
return glucoseMaxValue;
}
}