/*
* Calendula - An assistant for personal medication management.
* Copyright (C) 2016 CITIUS - USC
*
* Calendula 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; either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 this software. If not, see <http://www.gnu.org/licenses/>.
*/
package es.usc.citius.servando.calendula.util;
import android.util.Log;
import com.google.ical.values.Frequency;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import es.usc.citius.servando.calendula.fragments.ScheduleTypeFragment;
import es.usc.citius.servando.calendula.persistence.Medicine;
import es.usc.citius.servando.calendula.persistence.Schedule;
import es.usc.citius.servando.calendula.persistence.ScheduleItem;
/**
* Created by joseangel.pineiro on 12/12/13.
*/
public class ScheduleHelper {
private static ScheduleHelper instance;
private List<ScheduleItem> scheduleItems;
private Schedule schedule;
private Medicine selectedMed;
private int selectedScheduleIdx = 0;
private int timesPerDay = 1;
private int scheduleType = -1;
private ScheduleHelper() {
setScheduleItems(new ArrayList<ScheduleItem>());
}
public static ScheduleHelper instance() {
if (instance == null)
instance = new ScheduleHelper();
return instance;
}
public static boolean cycleEnabledForDate(LocalDate date, LocalDate s, int activeDays,
int restDays) {
DateTime start = s.toDateTimeAtStartOfDay();
DateTime day = date.toDateTimeAtStartOfDay().plusDays(1);
if (day.isBefore(start)) return false;
int activePeriod = activeDays;
int restPeriod = restDays;
int cycleLength = activePeriod + restPeriod;
int days = (int) new Interval(start, day).toDuration().getStandardDays();
int cyclesUntilNow = days / cycleLength;
Log.d("ScheduleHelper",
"start: " + start.toString("dd/MM/YYYY") + ", day: " + day.toString("dd/MM/YYYY"));
Log.d("ScheduleHelper", "Active: "
+ activePeriod
+ ", rest: "
+ restPeriod
+ ", cycle: "
+ cycleLength
+ ", days: "
+ days
+ ", cyclesUntilNow: "
+ cyclesUntilNow);
// get start of current cycle
DateTime cycleStart = start.plusDays(cyclesUntilNow * cycleLength);
return new Interval(cycleStart, cycleStart.plusDays(activePeriod)).contains(
date.toDateTimeAtStartOfDay());
}
public Medicine getSelectedMed() {
return selectedMed;
}
public void setSelectedMed(Medicine selectedMed) {
this.selectedMed = selectedMed;
}
public List<ScheduleItem> getScheduleItems() {
return scheduleItems;
}
public void setScheduleItems(List<ScheduleItem> scheduleItems) {
this.scheduleItems = scheduleItems;
}
public int getSelectedScheduleIdx() {
return selectedScheduleIdx;
}
public void setSelectedScheduleIdx(int selectedScheduleIdx) {
this.selectedScheduleIdx = selectedScheduleIdx;
}
public Schedule getSchedule() {
return schedule;
}
public void setSchedule(Schedule schedule) {
this.schedule = schedule;
if (schedule != null && scheduleType == -1) {
if (schedule.rule().frequency() == Frequency.HOURLY) {
this.setScheduleType(ScheduleTypeFragment.TYPE_HOURLY);
} else if (schedule.type() == Schedule.SCHEDULE_TYPE_CYCLE) {
this.setScheduleType(ScheduleTypeFragment.TYPE_PERIOD);
} else {
this.setScheduleType(ScheduleTypeFragment.TYPE_ROUTINES);
}
}
}
public int getTimesPerDay() {
return timesPerDay;
}
public void setTimesPerDay(int timesPerDay) {
this.timesPerDay = timesPerDay;
}
public void clear() {
instance = null;
}
@Override
public String toString() {
return "ScheduleCreationHelper{" +
"selectedMed=" + selectedMed.name() +
", selectedScheduleIdx=" + selectedScheduleIdx +
", timesPerDay=" + timesPerDay +
", scheduleItems=" + scheduleItems.size() +
'}';
}
public int getScheduleType() {
return scheduleType;
}
public void setScheduleType(int scheduleType) {
this.scheduleType = scheduleType;
}
}