package com.zhuinden.simplestackdemoexamplefragments.presentation.paths.tasks;
import android.content.res.Resources;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.jakewharton.rxrelay2.BehaviorRelay;
import com.zhuinden.simplestack.Backstack;
import com.zhuinden.simplestack.Bundleable;
import com.zhuinden.simplestackdemoexamplefragments.application.Key;
import com.zhuinden.simplestackdemoexamplefragments.data.repository.TaskRepository;
import com.zhuinden.simplestackdemoexamplefragments.presentation.objects.Task;
import com.zhuinden.simplestackdemoexamplefragments.presentation.paths.addoredittask.AddOrEditTaskKey;
import com.zhuinden.simplestackdemoexamplefragments.presentation.paths.taskdetail.TaskDetailKey;
import com.zhuinden.simplestackdemoexamplefragments.util.BasePresenter;
import com.zhuinden.statebundle.StateBundle;
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* Created by Owner on 2017. 01. 27..
*/
// UNSCOPED!
public class TasksPresenter
extends BasePresenter<TasksFragment, TasksPresenter>
implements Bundleable {
@Inject
public TasksPresenter() {
}
@Inject
Backstack backstack;
@Inject
TaskRepository taskRepository;
@Inject
Resources resources;
BehaviorRelay<TasksFilterType> filterType = BehaviorRelay.createDefault(TasksFilterType.ALL_TASKS);
Disposable subscription;
@Override
public void onAttach(TasksFragment tasksFragment) {
subscription = filterType //
.doOnNext(tasksFilterType -> tasksFragment.setFilterLabelText(tasksFilterType.getFilterText())) //
.switchMap((tasksFilterType -> tasksFilterType.filterTask(taskRepository))) //
.observeOn(Schedulers.computation())
.map(tasks -> tasksFragment.calculateDiff(tasks))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(pairOfDiffResultAndTasks -> {
if(tasksFragment != null) {
tasksFragment.showTasks(pairOfDiffResultAndTasks, filterType.getValue());
}
});
}
@Override
public void onDetach(TasksFragment Fragment) {
subscription.dispose();
}
public void openAddNewTask() {
TasksFragment tasksFragment = getFragment();
Key parentKey = tasksFragment.getKey();
backstack.goTo(AddOrEditTaskKey.create(parentKey));
}
public void openTaskDetails(Task task) {
backstack.goTo(TaskDetailKey.create(task.id()));
}
public void completeTask(Task task) {
taskRepository.setTaskCompleted(task);
getFragment().showTaskMarkedComplete();
}
public void uncompleteTask(Task task) {
taskRepository.setTaskActive(task);
getFragment().showTaskMarkedActive();
}
public void deleteCompletedTasks() {
taskRepository.deleteCompletedTasks();
getFragment().showCompletedTasksCleared();
}
public void setFiltering(TasksFilterType filterType) {
this.filterType.accept(filterType);
}
@Override
@NonNull
public StateBundle toBundle() {
StateBundle bundle = new StateBundle();
bundle.putString("FILTERING", filterType.getValue().name());
return bundle;
}
@Override
public void fromBundle(@Nullable StateBundle bundle) {
if(bundle != null) {
filterType.accept(TasksFilterType.valueOf(bundle.getString("FILTERING")));
}
}
}