package ru.ltst.u2020mvp.data.api.mock;
import android.content.SharedPreferences;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import retrofit2.Response;
import retrofit2.adapter.rxjava.Result;
import ru.ltst.u2020mvp.ApplicationScope;
import ru.ltst.u2020mvp.data.api.GalleryService;
import ru.ltst.u2020mvp.data.api.ServerDatabase;
import ru.ltst.u2020mvp.data.api.SortUtil;
import ru.ltst.u2020mvp.data.api.model.request.Section;
import ru.ltst.u2020mvp.data.api.model.request.Sort;
import ru.ltst.u2020mvp.data.api.model.response.Gallery;
import ru.ltst.u2020mvp.data.api.model.response.Image;
import ru.ltst.u2020mvp.util.EnumPreferences;
import rx.Observable;
@ApplicationScope
public final class MockGalleryService implements GalleryService {
private static final Gallery BAD_REQUEST = new Gallery(200, false, null);
private static final int PAGE_SIZE = 50;
private final SharedPreferences preferences;
private final ServerDatabase serverDatabase;
private final Map<Class<? extends Enum<?>>, Enum<?>> responses = new LinkedHashMap<>();
@Inject
MockGalleryService(ServerDatabase serverDatabase, SharedPreferences preferences) {
this.serverDatabase = serverDatabase;
this.preferences = preferences;
// Initialize mock responses.
loadResponse(MockGalleryResponse.class, MockGalleryResponse.SUCCESS);
}
@Override
public Observable<Result<Gallery>> listGallery(Section section, Sort sort, int page) {
// Fetch desired section.
List<Image> images = serverDatabase.getImagesForSection(section);
if (images == null) {
return Observable.just(Result.response(Response.success(BAD_REQUEST)));
}
// Figure out proper list subset.
int pageStart = (page - 1) * PAGE_SIZE;
if (pageStart >= images.size() || pageStart < 0) {
return Observable.just(Result.response(Response.success(BAD_REQUEST)));
}
int pageEnd = Math.min(pageStart + PAGE_SIZE, images.size());
// Sort and trim images.
SortUtil.sort(images, sort);
images = images.subList(pageStart, pageEnd);
return Observable.just(Result.response(Response.success(new Gallery(200, true, images))));
}
/**
* Initializes the current response for {@code responseClass} from {@code SharedPreferences}, or
* uses {@code defaultValue} if a response was not found.
*/
private <T extends Enum<T>> void loadResponse(Class<T> responseClass, T defaultValue) {
responses.put(responseClass, EnumPreferences.getEnumValue(preferences, responseClass, //
responseClass.getCanonicalName(), defaultValue));
}
public <T extends Enum<T>> Enum getResponse(Class<T> responseClass) {
return responseClass.cast(responses.get(responseClass));
}
public <T extends Enum<T>> void setResponse(Class<T> responseClass, T value) {
responses.put(responseClass, value);
EnumPreferences.saveEnumValue(preferences, responseClass.getCanonicalName(), value);
}
}