package com.flexpoker.table.query.eventsubscribers;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import com.flexpoker.framework.event.Event;
import com.flexpoker.framework.event.EventHandler;
import com.flexpoker.framework.event.subscriber.EventSubscriber;
import com.flexpoker.framework.event.subscriber.InMemoryThreadSafeEventSubscriberHelper;
import com.flexpoker.table.command.events.ActionOnChangedEvent;
import com.flexpoker.table.command.events.AutoMoveHandForwardEvent;
import com.flexpoker.table.command.events.CardsShuffledEvent;
import com.flexpoker.table.command.events.FlopCardsDealtEvent;
import com.flexpoker.table.command.events.HandCompletedEvent;
import com.flexpoker.table.command.events.HandDealtEvent;
import com.flexpoker.table.command.events.LastToActChangedEvent;
import com.flexpoker.table.command.events.PlayerAddedEvent;
import com.flexpoker.table.command.events.PlayerBustedTableEvent;
import com.flexpoker.table.command.events.PlayerCalledEvent;
import com.flexpoker.table.command.events.PlayerCheckedEvent;
import com.flexpoker.table.command.events.PlayerFoldedEvent;
import com.flexpoker.table.command.events.PlayerForceCheckedEvent;
import com.flexpoker.table.command.events.PlayerForceFoldedEvent;
import com.flexpoker.table.command.events.PlayerRaisedEvent;
import com.flexpoker.table.command.events.PlayerRemovedEvent;
import com.flexpoker.table.command.events.PotAmountIncreasedEvent;
import com.flexpoker.table.command.events.PotClosedEvent;
import com.flexpoker.table.command.events.PotCreatedEvent;
import com.flexpoker.table.command.events.RiverCardDealtEvent;
import com.flexpoker.table.command.events.RoundCompletedEvent;
import com.flexpoker.table.command.events.TableCreatedEvent;
import com.flexpoker.table.command.events.TablePausedEvent;
import com.flexpoker.table.command.events.TableResumedEvent;
import com.flexpoker.table.command.events.TurnCardDealtEvent;
import com.flexpoker.table.command.events.WinnersDeterminedEvent;
import com.flexpoker.table.command.framework.TableEvent;
@Component("tableEventSubscriber")
public class InMemoryAsyncTableEventSubscriber implements EventSubscriber<TableEvent> {
private final InMemoryThreadSafeEventSubscriberHelper inMemoryThreadSafeEventSubscriberHelper;
private final EventHandler<TableCreatedEvent> tableCreatedEventHandler;
private final EventHandler<HandDealtEvent> handDealtEventHandler;
private final EventHandler<PlayerBustedTableEvent> playerBustedTableEventHandler;
private final EventHandler<PlayerCalledEvent> playerCalledEventHandler;
private final EventHandler<PlayerCheckedEvent> playerCheckedEventHandler;
private final EventHandler<PlayerForceCheckedEvent> playerForceCheckedEventHandler;
private final EventHandler<PlayerFoldedEvent> playerFoldedEventHandler;
private final EventHandler<PlayerForceFoldedEvent> playerForceFoldedEventHandler;
private final EventHandler<PlayerRaisedEvent> playerRaisedEventHandler;
private final EventHandler<FlopCardsDealtEvent> flopCardsDealtEventHandler;
private final EventHandler<TurnCardDealtEvent> turnCardDealtEventHandler;
private final EventHandler<RiverCardDealtEvent> riverCardDealtEventHandler;
private final EventHandler<RoundCompletedEvent> roundCompletedEventHandler;
private final EventHandler<ActionOnChangedEvent> actionOnChangedEventHandler;
private final EventHandler<PotAmountIncreasedEvent> potAmountIncreasedEventHandler;
private final EventHandler<PotClosedEvent> potClosedEventHandler;
private final EventHandler<PotCreatedEvent> potCreatedEventHandler;
private final EventHandler<WinnersDeterminedEvent> winnersDeterminedEventHandler;
@Inject
public InMemoryAsyncTableEventSubscriber(
InMemoryThreadSafeEventSubscriberHelper inMemoryThreadSafeEventSubscriberHelper,
EventHandler<TableCreatedEvent> tableCreatedEventHandler,
EventHandler<HandDealtEvent> handDealtEventHandler,
EventHandler<PlayerBustedTableEvent> playerBustedTableEventHandler,
EventHandler<PlayerCalledEvent> playerCalledEventHandler,
EventHandler<PlayerCheckedEvent> playerCheckedEventHandler,
EventHandler<PlayerForceCheckedEvent> playerForceCheckedEventHandler,
EventHandler<PlayerFoldedEvent> playerFoldedEventHandler,
EventHandler<PlayerForceFoldedEvent> playerForceFoldedEventHandler,
EventHandler<PlayerRaisedEvent> playerRaisedEventHandler,
EventHandler<FlopCardsDealtEvent> flopCardsDealtEventHandler,
EventHandler<TurnCardDealtEvent> turnCardDealtEventHandler,
EventHandler<RiverCardDealtEvent> riverCardDealtEventHandler,
EventHandler<RoundCompletedEvent> roundCompletedEventHandler,
EventHandler<ActionOnChangedEvent> actionOnChangedEventHandler,
EventHandler<PotAmountIncreasedEvent> potAmountIncreasedEventHandler,
EventHandler<PotClosedEvent> potClosedEventHandler,
EventHandler<PotCreatedEvent> potCreatedEventHandler,
EventHandler<WinnersDeterminedEvent> winnersDeterminedEventHandler) {
this.inMemoryThreadSafeEventSubscriberHelper = inMemoryThreadSafeEventSubscriberHelper;
this.tableCreatedEventHandler = tableCreatedEventHandler;
this.handDealtEventHandler = handDealtEventHandler;
this.playerBustedTableEventHandler = playerBustedTableEventHandler;
this.playerCalledEventHandler = playerCalledEventHandler;
this.playerCheckedEventHandler = playerCheckedEventHandler;
this.playerForceCheckedEventHandler = playerForceCheckedEventHandler;
this.playerFoldedEventHandler = playerFoldedEventHandler;
this.playerForceFoldedEventHandler = playerForceFoldedEventHandler;
this.playerRaisedEventHandler = playerRaisedEventHandler;
this.flopCardsDealtEventHandler = flopCardsDealtEventHandler;
this.turnCardDealtEventHandler = turnCardDealtEventHandler;
this.riverCardDealtEventHandler = riverCardDealtEventHandler;
this.roundCompletedEventHandler = roundCompletedEventHandler;
this.actionOnChangedEventHandler = actionOnChangedEventHandler;
this.potAmountIncreasedEventHandler = potAmountIncreasedEventHandler;
this.potClosedEventHandler = potClosedEventHandler;
this.potCreatedEventHandler = potCreatedEventHandler;
this.winnersDeterminedEventHandler = winnersDeterminedEventHandler;
this.inMemoryThreadSafeEventSubscriberHelper.setHandlerMap(createEventHandlerMap());
}
@Async
@Override
public void receive(TableEvent event) {
inMemoryThreadSafeEventSubscriberHelper.receive(event);
}
private Map<Class<? extends Event>, EventHandler<? extends Event>> createEventHandlerMap() {
Map<Class<? extends Event>, EventHandler<? extends Event>> eventHandlerMap = new HashMap<>();
eventHandlerMap.put(ActionOnChangedEvent.class, actionOnChangedEventHandler);
eventHandlerMap.put(AutoMoveHandForwardEvent.class, x -> {});
eventHandlerMap.put(CardsShuffledEvent.class, x -> {});
eventHandlerMap.put(FlopCardsDealtEvent.class, flopCardsDealtEventHandler);
eventHandlerMap.put(HandCompletedEvent.class, x -> {});
eventHandlerMap.put(HandDealtEvent.class, handDealtEventHandler);
eventHandlerMap.put(LastToActChangedEvent.class, x -> {});
eventHandlerMap.put(PlayerAddedEvent.class, x -> {});
eventHandlerMap.put(PlayerBustedTableEvent.class, playerBustedTableEventHandler);
eventHandlerMap.put(PlayerCalledEvent.class, playerCalledEventHandler);
eventHandlerMap.put(PlayerCheckedEvent.class, playerCheckedEventHandler);
eventHandlerMap.put(PlayerForceCheckedEvent.class, playerForceCheckedEventHandler);
eventHandlerMap.put(PlayerFoldedEvent.class, playerFoldedEventHandler);
eventHandlerMap.put(PlayerForceFoldedEvent.class, playerForceFoldedEventHandler);
eventHandlerMap.put(PlayerRaisedEvent.class, playerRaisedEventHandler);
eventHandlerMap.put(PlayerRemovedEvent.class, x -> {});
eventHandlerMap.put(PotAmountIncreasedEvent.class, potAmountIncreasedEventHandler);
eventHandlerMap.put(PotClosedEvent.class, potClosedEventHandler);
eventHandlerMap.put(PotCreatedEvent.class, potCreatedEventHandler);
eventHandlerMap.put(RiverCardDealtEvent.class, riverCardDealtEventHandler);
eventHandlerMap.put(RoundCompletedEvent.class, roundCompletedEventHandler);
eventHandlerMap.put(TableCreatedEvent.class, tableCreatedEventHandler);
eventHandlerMap.put(TablePausedEvent.class, x -> {});
eventHandlerMap.put(TableResumedEvent.class, x -> {});
eventHandlerMap.put(TurnCardDealtEvent.class, turnCardDealtEventHandler);
eventHandlerMap.put(WinnersDeterminedEvent.class, winnersDeterminedEventHandler);
return eventHandlerMap;
}
}