package org.dicadeveloper.weplantaforest.planting.plantbag;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.dicadeveloper.weplantaforest.common.errorHandling.ErrorCodes;
import org.dicadeveloper.weplantaforest.common.errorHandling.IpatErrorInfo;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.NonNull;
@Component
public abstract class AbstractPlantBagValidator {
@Autowired
protected @NonNull TreeRepository _treeRepository;
@Autowired
protected @NonNull ProjectArticleRepository _projectArticleRepository;
@Autowired
protected @NonNull ProjectRepository _projectRepository;
protected List<IpatErrorInfo> errorInfos = new ArrayList<>();
@Autowired
protected AbstractPlantBagValidator(TreeRepository treeRepository, ProjectArticleRepository projectArticlerepository, ProjectRepository projectRepository) {
_treeRepository = treeRepository;
_projectArticleRepository = projectArticlerepository;
_projectRepository = projectRepository;
}
protected boolean projectsExist(Set<String> projectNames) {
for (String projectName : projectNames) {
if (!projectExists(projectName)) {
return false;
}
}
return true;
}
protected void projectsExistTemp(Set<String> projectNames) {
for (String projectName : projectNames) {
projectExistsTemp(projectName);
}
}
protected boolean projectsAreActive(Set<String> projectNames) {
for (String projectName : projectNames) {
if (!isProjectActive(projectName)) {
return false;
}
}
return true;
}
protected boolean articleExists(String projectName, String articleName) {
if (null != _projectArticleRepository.findArticleIdByProjectAndTreeType(projectName, articleName)) {
return true;
}
return false;
}
protected ProjectArticle articleExistsTemp(String projectName, String articleName) {
ProjectArticle article = _projectArticleRepository.findArticleByProjectAndTreeType(projectName, articleName);
if (null == article) {
addErrorInfo(ErrorCodes.ARTICLE_DOES_NOT_EXISTS, projectName, articleName);
}
return article;
}
protected boolean projectExists(String projectName) {
if (null != _projectRepository.findByName(projectName)) {
return true;
}
return false;
}
protected Project projectExistsTemp(String projectName) {
Project project = _projectRepository.findByName(projectName);
if (null == project) {
addErrorInfo(ErrorCodes.PROJECT_DOES_NOT_EXISTS, projectName);
}
return project;
}
protected boolean isProjectActive(String projectName) {
return _projectRepository.findByName(projectName)
.getShopActive();
}
protected boolean isProjectActiveTemp(Project project) {
boolean isActive = true;
if (!project.getShopActive()) {
addErrorInfo(ErrorCodes.PROJECT_NOT_ACTIVE, project.getName());
isActive = false;
}
return isActive;
}
protected boolean isThereEnoughTreesRemainingForThisArticle(String projectName, String articleName, long wantedToPlant) {
Long articleId = _projectArticleRepository.findArticleIdByProjectAndTreeType(projectName, articleName);
ProjectArticle article = _projectArticleRepository.findOne(articleId);
Long articleAmount = article.getAmount();
Long alreadyPlanted = _treeRepository.countAlreadyPlantedTreesByProjectArticle(article);
Long treesRemaining = articleAmount - alreadyPlanted;
if (wantedToPlant <= treesRemaining) {
/*
* perhaps we can add here some messages to tell the user what
* exactly the problem was
*
* something like: There are not enough trees of %treeType% in
* project %project% anymore
*/
return true;
} else {
return false;
}
}
protected void areThereEnoughTreesRemainingForThisArticleTemp(ProjectArticle article, Long wantedToPlant, String projectName, String articleName) {
Long articleAmount = article.getAmount();
Long alreadyPlanted = _treeRepository.countAlreadyPlantedTreesByProjectArticle(article);
Long treesRemaining = articleAmount - alreadyPlanted;
if (wantedToPlant > treesRemaining) {
addErrorInfo(ErrorCodes.NOT_ENOUGH_TREES, projectName, articleName, wantedToPlant.toString(), treesRemaining.toString());
}
}
protected void addErrorInfo(String errorCode, String... params){
IpatErrorInfo errorInfo = new IpatErrorInfo(errorCode, params);
errorInfos.add(errorInfo);
}
}