package fr.ydelouis.selfoss.model;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.OrmLiteDao;
import java.util.List;
import fr.ydelouis.selfoss.entity.Article;
import fr.ydelouis.selfoss.entity.ArticleType;
import fr.ydelouis.selfoss.entity.Filter;
import fr.ydelouis.selfoss.entity.Tag;
import fr.ydelouis.selfoss.rest.SelfossRestWrapper;
@EBean
public class ArticleProvider {
private static final int PAGE_SIZE = 10;
@Bean
protected SelfossRestWrapper selfossRest;
@OrmLiteDao(helper = DatabaseHelper.class, model = Article.class)
protected ArticleDao articleDao;
private Listener listener = new NullListener();
private Filter filter = new Filter();
public void setFilter(Filter filter) {
this.filter = filter;
}
public Filter getFilter() {
return filter;
}
public void setListener(Listener listener) {
this.listener = listener != null ? listener : new NullListener();
}
@Background
public void loadNext(int count, Article item) {
List<Article> articles = articleDao.queryForNext(filter, item, PAGE_SIZE);
if (articles.isEmpty()) {
articles = tryToLoadNewFromRest(count);
if (articles != null && item != null) {
keepOnlyNext(articles, item);
}
}
listener.onNextLoaded(articles);
}
private List<Article> tryToLoadNewFromRest(int count) {
try {
return loadNextFromRest(count);
} catch (Exception e) {
return null;
}
}
private List<Article> loadNextFromRest(int count) {
if (filter.getType() == ArticleType.Newest) {
if (filter.getTag() == Tag.ALL) {
return selfossRest.listArticles(count, PAGE_SIZE);
} else if (filter.getTag() != null) {
return selfossRest.listArticles(filter.getTag(), count, PAGE_SIZE);
} else {
return selfossRest.listArticles(filter.getSource().getId(), count, PAGE_SIZE);
}
} else {
if (filter.getTag() == Tag.ALL) {
return selfossRest.listArticles(filter.getType(), count, PAGE_SIZE);
} else if (filter.getTag() != null) {
return selfossRest.listArticles(filter.getType(), filter.getTag(), count, PAGE_SIZE);
} else {
return selfossRest.listArticles(filter.getType(), filter.getSource().getId(), count, PAGE_SIZE);
}
}
}
private void keepOnlyNext(List<Article> articles, Article item) {
while (!articles.isEmpty() && articles.get(0).getDateTime() > item.getDateTime()) {
articles.remove(0);
}
}
public void loadNew(Article firstArticle) {
List<Article> articles = articleDao.queryForPrevious(filter, firstArticle);
listener.onNewLoaded(articles);
}
public interface Listener {
void onNextLoaded(List<Article> articles);
void onNewLoaded(List<Article> articles);
}
private static class NullListener implements Listener {
@Override
public void onNextLoaded(List<Article> articles) {
}
@Override
public void onNewLoaded(List<Article> articles) {
}
}
}