public ImageIcon getNumberImage() {
   ImageIcon numberImage = null;
   if (currentQuestion < 10) {
     numberImage = provider.getImage(ChildrenResource.NUMBER_IMAGE_MAP.get(currentQuestion));
   } else {
     numberImage =
         provider.getScaledImage(ChildrenResource.NUMBER_IMAGE_MAP.get(currentQuestion), 1.33f);
   }
   return numberImage;
 }
  public ImageIcon getGraphicImage() {
    ImageIcon graphicImage = null;

    switch (currentQuestion) {
      case 1:
        graphicImage = provider.getImage(ChildrenResource.imageMatch1);
        break;
      case 2:
        graphicImage = provider.getImage(ChildrenResource.imageMatch2);
        break;
      case 4:
        graphicImage = provider.getImage(ChildrenResource.imageMatch4);
        break;
      case 6:
        graphicImage = provider.getImage(ChildrenResource.imageMatch6);
        break;
      case 8:
        graphicImage = provider.getImage(ChildrenResource.imageMatch8);
        break;
    }
    return graphicImage;
  }
/**
 * NumberMatchingGameController
 *
 * @author David Bardwell
 * @author Adam Phung
 */
public class NumberMatchingGameController extends AbstractGameController {

  private static final int POINTS_PER_QUESTION = 10;
  private int currentQuestion = 1;
  private Map<Integer, int[]> numberChoicesMap;
  private Map<Integer, int[]> imageChoicesMap;
  private Map<Integer, Integer> correctNumberAnswerMap;
  private Map<Integer, Integer> correctImageAnswerMap;
  ChildrenResourceProvider provider = ChildrenResourceProvider.getInstance();
  private GameResultsController resultsController;
  private boolean isBusy = false;
  private boolean correctFirstTry = true;

  public NumberMatchingGameController(AbstractFrame mainFrame) {
    super(mainFrame);
    resultsController = getMainFrame().getController(GameResultsController.class);
  }

  public void startGame() {
    resultsController.notifyResultsController("Number Matching Game");
    resetAnswersForNextGame();

    // Start Stat Recording
    List<Game> games = LessonGameManager.getAllActiveGames();
    for (Game game : games) {
      if (game.getName().contains("Match")) start(game);
    }

    getMainFrame().changeView(NumberMatchingGameView.class);
  }

  /**
   * Ends the game and saves the result. pass true if entire game was completed pass false if game
   * is only partially complete, records in db at "Incomplete"
   *
   * @param complete
   */
  public void endGame(boolean complete) {
    if (isActive()) {
      int score = resultsController.getCorrect() * POINTS_PER_QUESTION;
      stop(complete, score);
    }

    if (complete) {
      getMainFrame()
          .getController(GameResultsController.class)
          .showResultsScreen(this.getEarnedAchievements());
    }
  }

  public int getCurrentQuestionNumber() {
    return currentQuestion;
  }

  public void resetAnswersForNextGame() {
    currentQuestion = 1;

    // Get answers for number match game for numbers
    NumberMatchingGameAnswerProvider numberAnswerProvider = new NumberMatchingGameAnswerProvider(5);

    numberAnswerProvider.generateRandomAnswers();
    numberChoicesMap = numberAnswerProvider.getAnswerSelections();
    correctNumberAnswerMap = numberAnswerProvider.getCorrectAnswers();

    // Get answers for number matching game for images
    NumberMatchingGameAnswerProvider imageAnswerProvider = new NumberMatchingGameAnswerProvider(3);

    imageAnswerProvider.generateRandomAnswers();
    imageChoicesMap = imageAnswerProvider.getAnswerSelections();
    correctImageAnswerMap = imageAnswerProvider.getCorrectAnswers();
  }

  public int[] getPossibleNumberAnswers() {
    return numberChoicesMap.get(currentQuestion);
  }

  public int[] getPossibleImageAnswers() {
    return imageChoicesMap.get(currentQuestion);
  }

  public ImageIcon getNumberImage() {
    ImageIcon numberImage = null;
    if (currentQuestion < 10) {
      numberImage = provider.getImage(ChildrenResource.NUMBER_IMAGE_MAP.get(currentQuestion));
    } else {
      numberImage =
          provider.getScaledImage(ChildrenResource.NUMBER_IMAGE_MAP.get(currentQuestion), 1.33f);
    }
    return numberImage;
  }

  public ImageIcon getGraphicImage() {
    ImageIcon graphicImage = null;

    switch (currentQuestion) {
      case 1:
        graphicImage = provider.getImage(ChildrenResource.imageMatch1);
        break;
      case 2:
        graphicImage = provider.getImage(ChildrenResource.imageMatch2);
        break;
      case 4:
        graphicImage = provider.getImage(ChildrenResource.imageMatch4);
        break;
      case 6:
        graphicImage = provider.getImage(ChildrenResource.imageMatch6);
        break;
      case 8:
        graphicImage = provider.getImage(ChildrenResource.imageMatch8);
        break;
    }
    return graphicImage;
  }

  public void answerButtonPressed(NumberMatchingGameView view, int buttonIndex) {
    if (isBusy) return;

    isBusy = true;
    processSelection(view, buttonIndex);
  }

  /**
   * Process the selection from the child user. Two matching games are intermixed so determine which
   * game is being played and if the child selected the correct answer or not. A correct answer
   * causes a short congratulations audio message to be played and causes the next question to be
   * shown. An incorrect answer causes a short try again audio message and keeps the child on the
   * same question to try again.
   *
   * @param view - NumberMatchingGameView
   * @param buttonIndex - index of the Answer button selected
   */
  public void processSelection(NumberMatchingGameView view, int buttonIndex) {
    final NumberMatchingGameView view2 = view;
    final int buttonIndex2 = buttonIndex;

    Thread processSelectionThread =
        new Thread() {
          public void run() {
            int correctAnswer = 0;
            if (currentQuestion == 10 || currentQuestion % 2 == 1) {
              correctAnswer = correctNumberAnswerMap.get(currentQuestion);
            } else {
              correctAnswer = correctImageAnswerMap.get(currentQuestion);
            }

            AudioPlayer audioPlayer = new AudioPlayer();

            if (buttonIndex2 == correctAnswer) {
              if (correctFirstTry == true) {
                resultsController.correct++;
              } else correctFirstTry = true;

              view2.updateMessage("Correct - Very Good!");
              byte[] audioData = provider.getAudioContent(ChildrenResource.audioCorrect);
              audioPlayer.playAudio(audioData);
              try {
                Thread.sleep(100);
              } catch (InterruptedException ie) {
                System.out.println("Thread interrupted");
              }
              view2.updateMessage("Select the correct answer");
              currentQuestion++;
              if (currentQuestion <= 10) {
                // view2.displayNextQuestion(choicesMap.get(currentQuestion));
                if (currentQuestion == 10 || currentQuestion % 2 == 1) {
                  view2.displayNextQuestion(numberChoicesMap.get(currentQuestion));
                } else {
                  view2.displayNextQuestion(imageChoicesMap.get(currentQuestion));
                }
              } else {
                // go to the game results screen
                isBusy = false;
                endGame(true);
              }
            } else {
              correctFirstTry = false;
              view2.updateMessage("Sorry, try again.");
              byte[] audioData = provider.getAudioContent(ChildrenResource.audioTryAgain);
              audioPlayer.playAudio(audioData);
              try {
                Thread.sleep(100);
              } catch (InterruptedException ie) {
                System.out.println("Thread interrupted");
              }

              view2.updateMessage("Select the correct answer");
            }
            isBusy = false;
          }
        };
    processSelectionThread.start();
  }
}