@Override
  public void restartBoard() {
    if (mHomeView == null) return;

    List<Integer> cardVals = new ArrayList<>();

    cardVals.clear();
    cardsList.clear();

    for (int i = 0; i < pairs; i++) {
      cardVals.add(i);
      cardVals.add(i);
    }

    Collections.shuffle(cardVals);

    for (int val : cardVals) {
      CardModel c = new CardModel();
      c.setId(val);
      cardsList.add(c);
    }
    c1 = null;
    c2 = null;
    bAllowClick = true;

    iUserScore = 0;
    mHomeView.updateScore(iUserScore);
    changeVisibilityCards();
    flipBackAllCards();
  }
  @Override
  public void doTurn(ImageView imageBoard, int position) {
    if (mHomeView == null) return;

    if (bAllowClick) {
      if (!cardsList.get(position).isMatched())
        if (c1 == null && !cardsList.get(position).isFlipped()) {
          cardsList.get(position).setFlipped(true);
          c1 = cardsList.get(position);
          mHomeView.flipCard(imageBoard, c1.getId());
        } else if (c2 == null && !cardsList.get(position).isFlipped()) {
          cardsList.get(position).setFlipped(true);
          c2 = cardsList.get(position);
          mHomeView.flipCard(imageBoard, c2.getId());

          bAllowClick = false;
          startTimer(1000);
        }
    }
  }
  @Override
  public void flipAllCards() {
    if (mHomeView == null) return;

    bAllowClick = false;

    for (int a = 0; a < cardsList.size(); a++)
      mHomeView.flipCard(cardsView.get(a), cardsList.get(a).getId());

    startTimer(3000);
  }
  @Override
  public void checkCards() {
    if (mHomeView == null) return;

    if (c1.getId() == c2.getId()) {
      c1.setMatched(true);
      c2.setMatched(true);
      iUserScore += iCorrectPair;
      mHomeView.updateScore(iUserScore);
      c1 = null;
      c2 = null;
      changeVisibilityCards();

      if (isGameWon()) mHomeView.onGameFinished(iUserScore);
    } else {
      iUserScore -= iInCorrectPair;

      mHomeView.updateScore(iUserScore);
      flipBackAllCards();
    }

    bAllowClick = true;
  }
  @Override
  public void flipBackAllCards() {
    if (mHomeView == null) return;

    for (int a = 0; a < cardsList.size(); a++) {
      if (!cardsList.get(a).isMatched()) {
        cardsList.get(a).setFlipped(false);
        mHomeView.flipBack(cardsView.get(a));
      } else {
        cardsList.get(a).setFlipped(true);
      }
    }
    c1 = null;
    c2 = null;
  }
 @Override
 public void changeVisibilityCards() {
   for (int a = 0; a < cardsList.size(); a++)
     mHomeView.changeVisibilityCard(cardsView.get(a), !cardsList.get(a).isMatched());
 }