LocalMultiplayerScreenProvider.java

package com.github.quizclash.application.screen.provider;

import com.github.quizclash.application.QuizGame;
import com.github.quizclash.application.screen.OptionScreen;
import com.github.quizclash.application.screen.ScreenFactory;
import com.github.quizclash.domain.Player;
import com.github.quizclash.domain.Question;
import com.github.quizclash.domain.Repository;
import com.github.quizclash.domain.User;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class LocalMultiplayerScreenProvider implements ScreenProvider {
  private final Repository repository;
  private final ScreenFactory screenFactory;
  private final QuizGame quizGame;

  public LocalMultiplayerScreenProvider(Repository repository, ScreenFactory screenFactory) {
    this.repository = repository;
    this.screenFactory = screenFactory;
    List<User> users = this.repository.getUserRepository().getUsers();
    Collections.shuffle(users);
    Player[] players = new Player[users.size()];
    for (int i = 0; i < users.size(); i++) {
      players[i] = new Player(users.get(i).getName());
    }
    this.quizGame = new QuizGame(repository.getCategoryRepository(),
        repository.getSettingsRepository()
            .getCategoriesPerGameAndUser() * repository.getUserRepository().getUsers().size(),
        players);
  }

  @Override
  public void execute() {
    while (!quizGame.isFinished()) {
      if (quizGame.isSelectingCategory()) {
        String playerName = quizGame.getCurrentPlayer().getPlayerName();
        OptionScreen optionScreen = screenFactory.createOptionScreen(
            playerName + ", select category", quizGame.getRemainingGameCategories());
        optionScreen.render();
        int action = optionScreen.getOptionInput().getActionValue();
        quizGame.setCurrentCategory(action - 1);
      } else {
        Question currentQuestion = quizGame.getCurrentQuestion();
        OptionScreen optionScreen = screenFactory.createOptionScreen(
            "Question: " + currentQuestion.getQuestion(),
            List.of(currentQuestion.getQuestionOptions()));
        optionScreen.render();
        int action = optionScreen.getOptionInput().getActionValue();
        quizGame.submitQuestionAnswer(action - 1);
      }
    }
    List<String> lines = new ArrayList<>();
    Player[] players = quizGame.getPlayers();
    for (Player player : players) {
      lines.add(String.format("%s - %d points", player.getPlayerName(),
          player.getCurrentScore().getIntScore()));
    }
    screenFactory.createInformationScreen("Result", lines).render();
  }

  public ScreenProviderType getNextScreenProviderType() {
    return ScreenProviderType.MENU;
  }
}