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

#include "flop.h"

void _pokerActionFlopDo(queue_t *queue, queueaction_t *action, uint8_t count) {
  poker_t *poker;
  poker = (poker_t *)action->data;

  pokerDealerBurn(&poker->dealer, 1);
  pokerDealerTurn(&poker->dealer, count);

  printf("Turned %u cards\n", count);
  queueNext(queue);
}

void _pokerActionFlopOnStart(queue_t *queue, queueaction_t *action, uint8_t i) {
  _pokerActionFlopDo(queue, action, POKER_FLOP_CARD_COUNT);
}

void _pokerActionTurnOnStart(queue_t *queue, queueaction_t *action, uint8_t i) {
  _pokerActionFlopDo(queue, action, POKER_TURN_CARD_COUNT);
}

void _pokerActionRiverOnStart(queue_t *queue, queueaction_t *action, uint8_t i) {
  _pokerActionFlopDo(queue, action, POKER_RIVER_CARD_COUNT);
}

queueaction_t * pokerActionFlopAdd(queue_t *queue, poker_t *poker) {
  queueaction_t *action;
  action = queueAdd(queue);
  action->data = (void *)poker;
  action->onStart = &_pokerActionFlopOnStart;
  return action;
}

queueaction_t * pokerActionTurnAdd(queue_t *queue, poker_t *poker) {
  queueaction_t *action;
  action = queueAdd(queue);
  action->data = (void *)poker;
  action->onStart = &_pokerActionTurnOnStart;
  return action;
}

queueaction_t * pokerActionRiverAdd(queue_t *queue, poker_t *poker) {
  queueaction_t *action;
  action = queueAdd(queue);
  action->data = (void *)poker;
  action->onStart = &_pokerActionRiverOnStart;
  return action;
}

queueaction_t * pokerActionNextFlopAdd(queue_t *queue, poker_t *poker) {
  switch(poker->dealer.cardsFacing) {
    case 0:
      return pokerActionFlopAdd(queue, poker);

    case POKER_FLOP_CARD_COUNT:
      return pokerActionTurnAdd(queue, poker);

    case POKER_FLOP_CARD_COUNT+POKER_TURN_CARD_COUNT:
      return pokerActionRiverAdd(queue, poker);

    default:
      return NULL;
  }
}