package org.kidinov.just_weather.weather.presentation;
import org.kidinov.just_weather.util.RxUtil;
import org.kidinov.just_weather.weather.WeatherContract;
import org.kidinov.just_weather.weather.model.WeatherRepository;
import org.kidinov.just_weather.weather.model.local.City;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.disposables.CompositeDisposable;
import timber.log.Timber;
public class WeatherPresenter implements WeatherContract.Presenter {
private CompositeDisposable subscriptions = new CompositeDisposable();
private WeatherRepository repository;
private WeatherContract.View view;
@Inject
public WeatherPresenter(WeatherRepository repository, WeatherContract.View view) {
this.repository = repository;
this.view = view;
}
@Override
public void updateData(boolean refresh) {
if (!refresh) {
view.showProgress();
}
subscriptions.add(repository.updateWeatherInfo()
.subscribe(
x -> {
Timber.d("weather updated");
getDataFromDb(false);
},
e -> {
Timber.e(e);
getDataFromDb(true);
view.showNetworkErrorNotification();
}));
}
@Override
public void addCityByCoordinates(double latitude, double longitude) {
subscriptions.add(repository.addCity(latitude, longitude)
.subscribe(
weatherInCity -> {
Timber.d("city added - %s", weatherInCity);
getDataFromDb(false);
}, e -> {
Timber.e(e);
getDataFromDb(true);
}));
}
@Override
public void addCityByName(String name) {
view.showProgress();
subscriptions.add(repository.addCity(name)
.subscribe(
weatherInCity -> {
Timber.d("city added - %s", weatherInCity);
getDataFromDb(false);
}, e -> {
Timber.e(e);
getDataFromDb(true);
view.showNetworkErrorNotification();
}));
}
@Override
public void itemRemovedAtPosition(int swipedPosition) {
subscriptions.add(getSortedListOfCities()
.flatMapCompletable(cities -> {
if (!cities.isEmpty()) {
City cityToDelete = cities.get(swipedPosition);
if (cityToDelete.isCurrentLocationCity()) {
view.showCurrentCityDeletionErrorNotification();
return Completable.complete();
}
return repository.removeCityById(cityToDelete.getId());
}
return Completable.complete();
})
.subscribe(
() -> {
Timber.d("city removed");
getDataFromDb(false);
}, e -> {
Timber.e(e);
getDataFromDb(true);
view.showNetworkErrorNotification();
}));
}
private void getDataFromDb(boolean error) {
subscriptions.add(getSortedListOfCities()
.subscribe(cities -> {
if (cities.isEmpty()) {
if (error) {
view.showError();
} else {
view.showEmptyState();
}
} else {
view.showData(cities);
}
}, Timber::e));
}
private Single<List<City>> getSortedListOfCities() {
return repository.getAddedCitiesWeather()
.flatMapObservable(Observable::fromIterable)
.toSortedList((w1, w2) -> {
if (w1.isCurrentLocationCity()) {
return -1;
}
if (w2.isCurrentLocationCity()) {
return 1;
}
return w1.getName().compareTo(w2.getName());
});
}
@Override
public void subscribe() {
}
@Override
public void unsubscribe() {
RxUtil.unsubscribe(subscriptions);
}
}