/**
 * 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 "player.h"
#include "card.h"
#include "render.h"
#include "winner.h"

#include "round/match.h"

#include "../display/camera.h"
#include "../display/shader.h"
#include "../display/texture.h"
#include "../display/tileset.h"
#include "../display/framebuffer.h"
#include "../display/primitive.h"

/** Rounds that the game can be in */
#define POKER_ROUND_MATCH 0x00
#define POKER_ROUND_START 0x01
#define POKER_ROUND_BLINDS 0x02
#define POKER_ROUND_DEAL 0x03
#define POKER_ROUND_BET0 0x04
#define POKER_ROUND_FLOP 0X05
#define POKER_ROUND_BET1 0x06
#define POKER_ROUND_TURN 0x07
#define POKER_ROUND_BET2 0x08
#define POKER_ROUND_RIVER 0x09
#define POKER_ROUND_BET3 0x0A
#define POKER_ROUND_WINNER 0x0B

/** GUI Height fix (To keep gui scaling nicely we use a fixed height) */
#define POKER_GUI_HEIGHT 2160

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

#define POKER_FLOP_CARD_COUNT 3
#define POKER_TURN_CARD_COUNT 1
#define POKER_RIVER_CARD_COUNT 1
typedef struct {
  //////////////////////////////////////////////////////////////////////////////
  // Poker Logic Variables
  //////////////////////////////////////////////////////////////////////////////

  /** Poker betting state */
  pokerbet_t bet;
  
  /** Player States */
  pokerdealer_t dealer;
  pokerplayer_t players[POKER_PLAYER_COUNT];
  pokerwinner_t winner;

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

  //////////////////////////////////////////////////////////////////////////////
  // Round variables
  //////////////////////////////////////////////////////////////////////////////

  /** The current round the game is on */
  uint8_t round;

  /** For Betting round, which player is currently betting */
  uint8_t roundBetCurrent;
  uint32_t roundTextCounter;

  pokerroundmatch_t roundMatch;

  //////////////////////////////////////////////////////////////////////////////
  // Rendering Variables
  //////////////////////////////////////////////////////////////////////////////

  /** Frames to hold the world and GUI render outputs */
  framebuffer_t frameWorld, frameGui;

  /** Game's Shader */
  shader_t shader;
  
  /** Camera for the world and the GUI */
  camera_t cameraWorld, cameraGui;

  /** Refer to POKER_GUI_HEIGHT */
  float guiWidth;

  texture_t chipTexture;
  primitive_t chipPrimitive;
  
  texture_t tableTexture;
  primitive_t tablePrimitive;

  texture_t cardTexture;
  tileset_t cardTileset;
  primitive_t cardPrimitive;
} poker_t;