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

#pragma once
#include "../libs.h"
#include "player.h"
#include "dealer.h"

/** Size of the FULL hand used to calculate a winning. */
#define POKER_WINNING_FULL_SIZE POKER_PLAYER_HAND+POKER_DEALER_HAND_SIZE

/** How many cards make a winning set */
#define POKER_WINNING_SET_SIZE 5

/** Winning Types */
#define POKER_WINNING_TYPE_NULL 0x00
#define POKER_WINNING_TYPE_ROYAL_FLUSH 0x01
#define POKER_WINNING_TYPE_STRAIGHT_FLUSH 0x02
#define POKER_WINNING_TYPE_FOUR_OF_A_KIND 0x03
#define POKER_WINNING_TYPE_FULL_HOUSE 0x04
#define POKER_WINNING_TYPE_FLUSH 0x05
#define POKER_WINNING_TYPE_STRAIGHT 0x06
#define POKER_WINNING_TYPE_THREE_OF_A_KIND 0x07
#define POKER_WINNING_TYPE_TWO_PAIR 0x08
#define POKER_WINNING_TYPE_PAIR 0x09
#define POKER_WINNNIG_TYPE_HIGH_CARD 0x0A

/** Holds information about a player's winning state */
typedef struct {
  /** The full set of both the dealer and player's hand */
  card_t full[POKER_WINNING_FULL_SIZE];
  uint8_t fullSize;
  
  /** Holds the winning set */
  card_t set[POKER_WINNING_SET_SIZE];
  uint8_t setSize;

  /** Winning Type */
  uint8_t type;

  /** If there was a kicker card it will be here, otherwise -1 for no kicker */
  card_t kicker;
} pokerplayerwinning_t;

typedef struct {
  /** Winning States */
  pokerplayerwinning_t winnings[POKER_PLAYER_COUNT];
  uint8_t winners[POKER_PLAYER_COUNT];
  uint8_t winnerCount;
} pokerwinner_t;