package regexgolf2.services.challengegenerator;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import regexgolf2.model.Challenge;
import regexgolf2.model.Solution;
import regexgolf2.model.SolvableChallenge;
import regexgolf2.model.Word;
import regexgolf2.model.challengegenerator.Generator;
import regexgolf2.model.challengegenerator.RandomGenerator;
import regexgolf2.model.challengegenerator.TestGenerator;
import regexgolf2.model.containers.WordPool;
import com.google.java.contract.Ensures;
import com.google.java.contract.Requires;
public class ChallengeGeneratorService
{
private final WordPool _wordPool;
private Set<Generator> _generators = new HashSet<>();
private Generator _selectedGenerator;
@Requires("wordPool != null")
public ChallengeGeneratorService(WordPool wordPool)
{
_wordPool = wordPool;
initGenerators();
}
private void initGenerators()
{
Generator g = new TestGenerator();
_generators.add(g);
g = new RandomGenerator();
_generators.add(g);
_selectedGenerator = g;
}
/**
* Returns a Set of available Generators.
* {@link #setSelectedGenerator(Generator)} takes only these Generators
* as valid arguments.
*/
public Set<Generator> getGenerators()
{
return Collections.unmodifiableSet(_generators);
}
@Requires("getGenerators().contains(generator)")
public void setSelectedGenerator(Generator generator)
{
_selectedGenerator = generator;
}
@Ensures("result != null")
public Generator getSelectedGenerator()
{
return _selectedGenerator;
}
public SolvableChallenge generateChallenge()
{
Challenge c = getSelectedGenerator().generateChallenge(getFilteredWords());
SolvableChallenge sc = new SolvableChallenge(new Solution(), c);
return sc;
}
private List<Word> getFilteredWords()
{
return _wordPool.stream()
.filter(word -> true) //TODO filter properly
.collect(Collectors.toList());
}
}