package org.dicadeveloper.weplantaforest.planting.plantbag; import java.util.ArrayList; import java.util.List; import org.dicadeveloper.weplantaforest.projects.Project; import org.dicadeveloper.weplantaforest.projects.ProjectArticle; import org.dicadeveloper.weplantaforest.projects.ProjectArticleRepository; import org.dicadeveloper.weplantaforest.projects.ProjectRepository; import org.dicadeveloper.weplantaforest.trees.TreeRepository; import org.dicadeveloper.weplantaforest.treetypes.TreeTypeRepository; import org.springframework.data.domain.PageRequest; import lombok.NonNull; public abstract class AbstractPlantBagHelper { protected @NonNull ProjectRepository _projectRepository; protected @NonNull ProjectArticleRepository _projectArticleRepository; protected @NonNull TreeRepository _treeRepository; protected @NonNull TreeTypeRepository _treeTypeRepository; protected List<ProjectArticle> projectArticles; protected AbstractPlantBagHelper(ProjectRepository projectRepository, ProjectArticleRepository projectArticleRepository, TreeTypeRepository treeTypeRepository, TreeRepository treeRepository) { _projectRepository = projectRepository; _projectArticleRepository = projectArticleRepository; _treeTypeRepository = treeTypeRepository; _treeRepository = treeRepository; } protected boolean areThereTreesRemaining(ProjectArticle article) { return countTreesRemainingByThisArticle(article) > 0 ? true : false; } protected Long countTreesRemainingByThisArticle(ProjectArticle article) { return article.getAmount() - _treeRepository.countAlreadyPlantedTreesByProjectArticle(article); } protected ProjectArticle findProjectArticleWithHighestMarge() { ProjectArticle article = null; double maxMarge = 0.0; for (ProjectArticle projectArticle : projectArticles) { double articleMarge = projectArticle.getPrice().getMarge().doubleValue(); if (articleMarge > maxMarge) { maxMarge = articleMarge; article = projectArticle; } } projectArticles.remove(article); return article; } protected List<ProjectArticle> createListOfAllAvailableProjectArticles() { List<ProjectArticle> projectArticles = new ArrayList<>(); // only the active Projects for (Project project : _projectRepository.active(new PageRequest(0, 5))) { for (ProjectArticle article : project.getArticles()) { // add only articles, where there are remaining trees to plant if (areThereTreesRemaining(article)) { projectArticles.add(article); } } } return projectArticles; } protected List<ProjectArticle> createListOfAllAvailableProjectArticles(String projectName) { List<ProjectArticle> projectArticles = new ArrayList<>(); // only the active Projects for (ProjectArticle article : _projectArticleRepository.findByProjectName(projectName)) { // add only articles, where there are remaining trees to plant if (areThereTreesRemaining(article)) { projectArticles.add(article); } } return projectArticles; } protected boolean isLowerOrEqualThanTargetedPrice(double cartPrice, double targetedPrice) { return cartPrice <= targetedPrice; } }