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

#pragma once
#include "../libs.h"
#include "bet.h"
#include "dealer.h"
#include "winner.h"

/** How many cards to deal each player during the deal round */
#define POKER_DEAL_CARD_EACH 2

/** How many cards are dealt for the flop, turn and river */
#define POKER_FLOP_CARD_COUNT 3
#define POKER_TURN_CARD_COUNT 1
#define POKER_RIVER_CARD_COUNT 1


#define POKER_STATE_NULL 0x00
#define POKER_STATE_STARTING_MATCH 0x01
#define POKER_STATE_STARTING_ROUND 0x02
#define POKER_STATE_TAKING_BLINDS 0x03
#define POKER_STATE_DEALING 0x04
#define POKER_STATE_CARDS_FLOPPING 0x05
#define POKER_STATE_BETTING 0x06
#define POKER_STATE_DECIDING_WINNER 0x07

typedef struct {
  /** Poker betting state */
  pokerbet_t bet;
  
  /** Player States */
  pokerdealer_t dealer;
  pokerplayer_t players[POKER_PLAYER_COUNT];

  /** Winning player states */
  pokerwinner_t winner;

  /** The current player that is the dealer */
  uint8_t roundDealer;

  /** Which player is the small blind for this round */
  uint8_t roundSmallBlind;

  /** Which player is the big blind for this round */
  uint8_t roundBigBlind;

  uint8_t state;
} poker_t;

/**
 * Action the poker game winning state after it has been calculated previously.
 * 
 * @param poker Poker game to action the winning state of.
 */
void pokerGameWin(poker_t *poker);