/**
   * play a letter and check the match values, so if the user wins, the user receives an email with
   * the information of the match played
   *
   * @param position
   * @param letter
   * @return
   */
  public PlayLetterInfoTuple playLetter(int position, char letter) {
    Log.debug(TAG, "play letter: " + letter);
    boolean success = match.play(position, letter);
    if (match.isFinished() && match.isWon()) {
      NotificationService notificationService = null;
      try {
        notificationService =
            (NotificationService)
                ServiceLocator.getInstance().find(ServiceLocator.SERVICE_NOTIFICATION);
      } catch (Exception e) {
        e.printStackTrace();
      }

      if (notificationService != null) {
        notificationService.notifyWonMatch(
            player.getName() + " " + player.getSurname(),
            player.getEmail(),
            match.getWordName(),
            match.getScore(),
            match.getNumErrors());
      }
    }
    return new PlayLetterInfoTuple(
        success, match.isFinished(), match.isWon(), match.getScore(), match.getNumErrors());
  }
  /**
   * given the name of a category, it creates a match with its player, word and letterboxes
   *
   * @param categoryName
   * @return
   * @throws PlayerNotExistsException if the logged user is an admin
   */
  public MatchInfoTuple createMatch(String categoryName) throws PlayerNotExistsException {
    Log.debug(TAG, "create match for category: " + categoryName);
    DAOFactory daoFactory = PostgresDAOFactory.getInstance();

    // retrieve the player that is to be assigned to the new match
    PlayerDAO playerDAO = daoFactory.getPlayerDAO();
    try {
      player = playerDAO.get(username);
    } catch (PlayerNotExistsException e) {
      // the logged user is an admin user
      throw new PlayerNotExistsException();
    }

    // retrieve the category of the word that the match will have
    CategoryDAO categoryDAO = daoFactory.getCategoryDAO();
    Category category = null;
    try {
      category = categoryDAO.get(categoryName);
    } catch (CategoryNotExistsException e) {
      // this should never be the case, since a valid and existing
      // category is chosen from the UI (it is a precondition)
      e.printStackTrace();
    }

    // retrieve the global game parameters
    ParamsDAO paramsDAO = daoFactory.getParamsDAO();
    WordGuessParams params = paramsDAO.getParams();

    Word word = category.getRandomWord();

    try {
      match = new Match(params, player, word);
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (match != null) {
      return match.getMatchInfoTuple();
    } else {
      return null;
    }
  }
 /** @return the word of the match */
 public String getMatchWord() {
   String matchWord = match.getWordName();
   Log.debug(TAG, "match word: " + matchWord);
   return matchWord;
 }