/**
 * Copyright (c) 2021 Dominic Masters
 * 
 * This software is released under the MIT License.
 * https://opensource.org/licenses/MIT
 */

#pragma once
#include "fuck.h"
#include "poker.h"

/**
 * Add a player to the game. The player starts in an out state (with no chips).
 * 
 * @param poker Poker game instance to add to.
 * @return Player index.
 */
uint8_t pokerPlayerAdd(poker_t *poker);

/**
 * Add chips to a player. This will also update their state if they were out
 * to ensure that they are no longer.
 * 
 * @param player Player to add chips to.
 * @param chips Amount of chips to add.
 */
void pokerPlayerChipsAdd(pokerplayer_t *player, int32_t chips);

/**
 * Checks a players' state and decided whether or not the players still needs to
 * bet for the current round. This will check both whether the player has bet in
 * the current round yet, and whether or not they have met the call value of the
 * active pot.
 * 
 * @param poker Poker game instance.
 * @param playerIndex Player index to check.
 * @return 
 */
bool pokerPlayerDoesNeedToBetThisRound(poker_t *poker, uint8_t playerIndex);

/**
 * Determine whether or not a player CAN check, given the current max bet and
 * the players current bet.
 * 
 * @param poker Poker game instance.
 * @param player Player to check.
 * @return True if the player can check, false if they need to call first.
 */
bool pokerPlayerCanCheck(poker_t *poker, pokerplayer_t *player);

/**
 * Returns the full hand for a given player including the cards on the bench.
 * 
 * @param poker Poker game instance.
 * @param player Poker player to get the hand for.
 * @param cards Array to store the cards.
 */
void pokerPlayerGetFullHand(
  poker_t *poker, pokerplayer_t *player, card_t *cards
);