package net.mvla.mvhs.schedulecalendar;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.preference.PreferenceManager;
import com.crashlytics.android.Crashlytics;
import net.mvla.mvhs.BuildConfig;
import net.mvla.mvhs.MvpPresenter;
import net.mvla.mvhs.PrefUtils;
import net.mvla.mvhs.schedulecalendar.bellschedule.BellSchedule;
import net.mvla.mvhs.ui.WelcomeActivity;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
public class ScheduleCalendarPresenter extends MvpPresenter<ScheduleCalendarView> {
private BellSchedule mSchedule;
private List<ScheduleCalendarRepository.Event> mEvents;
private Calendar mSelectedDate;
private String mError;
public ScheduleCalendarPresenter() {
Calendar eventTime = Calendar.getInstance();
mSelectedDate = new GregorianCalendar();
mSelectedDate.clear();
mSelectedDate.set(eventTime.get(Calendar.YEAR), eventTime.get(Calendar.MONTH), eventTime.get(Calendar.DATE));
}
@Override
public void attachView(ScheduleCalendarView view) {
super.attachView(view);
}
public void onCreate() {
if (isViewAttached()) {
//noinspection ConstantConditions
if (!PrefUtils.isWelcomeDone(getView().getContext())) {
getView().getContext().startActivity(new Intent(getView().getContext(), WelcomeActivity.class));
}
if (mEvents == null && mSchedule == null) {
getView().setLoading();
updateBellScheduleAndCalendarEvents();
} else if (mError != null) {
getView().showCalendarError(mError);
} else {
if (mEvents != null) {
getView().setEvents(mEvents);
}
if (mSchedule != null) {
getView().setBellSchedule(mSchedule, mSelectedDate);
}
}
getView().setSelectedDate(mSelectedDate);
if (!PrefUtils.isCalWelcomeDone(getView().getContext())) {
getView().openCalendarView();
PrefUtils.markCalWelcomeDone(getView().getContext());
}
}
checkChangelog();
}
private void checkChangelog() {
//noinspection ConstantConditions
if (isViewAttached() && PrefUtils.isWelcomeDone(getView().getContext())) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getView().getContext());
final int currentVersion = BuildConfig.VERSION_CODE;
if (currentVersion > prefs.getInt("changelog_version", -1)) {
getView().showChangelog();
}
prefs.edit().putInt("changelog_version", currentVersion).apply();
}
}
public void onDateChanged(Calendar date) {
mSelectedDate = date;
updateBellScheduleAndCalendarEvents();
if (isViewAttached()) {
getView().setSelectedDate(date);
}
}
private void updateBellScheduleAndCalendarEvents() {
if (!isDeviceOnline()) {
if (isViewAttached()) {
//noinspection ConstantConditions
getView().showCalendarError("Not online - cannot retrieve online bell schedule");
}
return;
}
if (isViewAttached()) {
//noinspection ConstantConditions
getView().setLoading();
}
//Fetch today's events (from calendar) and bell schedule sheet entries in parallel
ScheduleCalendarRepository.getInstance(getView().getContext())
.getEventListOnDate(mSelectedDate)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<ScheduleCalendarRepository.Event>>() {
@Override
public void onCompleted() {
if (isViewAttached()) {
getView().hideCalendarProgress();
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
if (!BuildConfig.DEBUG)
Crashlytics.logException(e);
if (isViewAttached()) {
mError = "Error - " + e.getMessage();
getView().showCalendarError(mError);
}
}
@Override
public void onNext(List<ScheduleCalendarRepository.Event> events) {
mEvents = events;
if (isViewAttached()) {
getView().setEvents(mEvents);
}
}
});
ScheduleCalendarRepository.getInstance(getView().getContext())
.getBellSchedule(mSelectedDate)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<BellSchedule>() {
@Override
public void onCompleted() {
if (isViewAttached()) {
getView().hideBellScheduleProgress();
}
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
if (!BuildConfig.DEBUG)
Crashlytics.logException(e);
if (isViewAttached()) {
mError = "Error - " + e.getMessage();
//noinspection ConstantConditions
getView().showBellScheduleError(mError);
}
}
@Override
public void onNext(BellSchedule bellSchedule) {
mSchedule = bellSchedule;
if (isViewAttached()) {
//noinspection ConstantConditions
getView().setBellSchedule(bellSchedule, mSelectedDate);
}
}
});
}
private boolean isDeviceOnline() {
if (isViewAttached()) {
//noinspection ConstantConditions
ConnectivityManager connMgr =
(ConnectivityManager) getView().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
} else {
return false;
}
}
}