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

#pragma once
#include "../libs.h"
#include "../util/flags.h"
#include "../util/array.h"
#include "card.h"

/** How many cards a player can hold in their hand */
#define POKER_PLAYER_HAND 2

/** How many players in a poker game (excludes dealer) */
#define POKER_PLAYER_COUNT 5


////////////////////////////////////////////////////////////////////////////////
// Player States
////////////////////////////////////////////////////////////////////////////////
/** State for whether or not a player has folded */
#define POKER_PLAYER_STATE_FOLDED flagDefine(0)

/** State for whether or not a player is showing their hand */
#define POKER_PLAYER_STATE_SHOWING flagDefine(1)

/** State for whether or not the player is out */
#define POKER_PLAYER_STATE_OUT flagDefine(2)

/** Flag that is reset at the start of each round, and set when move occurs. */
#define POKER_PLAYER_STATE_ROUND_MOVE flagDefine(3)

/** The index that the player who is the human... is */
#define POKER_PLAYER_HUMAN_INDEX 0x02

////////////////////////////////////////////////////////////////////////////////
// Player Definition
////////////////////////////////////////////////////////////////////////////////

/** Poker Player State */
typedef struct {
  /** Cards in the players' hand */
  card_t cards[POKER_PLAYER_HAND];
  uint8_t cardCount;

  /** Current State of player */
  uint8_t state;
  
  /** Chips in players' posession */
  int32_t chips;
  
  /** Current bet in current round player has placed */
  int32_t currentBet;

  /** How many times for the current flop that the player has raised */
  int32_t timesRaised;
} pokerplayer_t;

/**
 * Returns whether or not the player is in the current round. This does not 
 * consider anything about whether they can/have bet or not, simply whether or
 * not they can even partake in the round.
 * 
 * @param player 
 * @return true 
 * @return false 
 */
bool pokerPlayerIsInRound(pokerplayer_t *player);

/**
 * Returns the count of players who remain in the current round. This is a sum
 * of pokerPlayerIsInRound.
 * 
 * @param players 
 * @return uint8_t 
 */
uint8_t pokerPlayerGetCountInRound(pokerplayer_t *players);

/**
 * Resets a poker player's state (for a new round).
 * 
 * @param player Player to reset.
 */
void pokerPlayerReset(pokerplayer_t *player);