package com.flexpoker.game.command.eventpublishers;
import java.util.Timer;
import java.util.TimerTask;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import com.flexpoker.framework.event.EventPublisher;
import com.flexpoker.framework.event.subscriber.EventSubscriber;
import com.flexpoker.framework.processmanager.ProcessManager;
import com.flexpoker.game.command.events.GameStartedEvent;
import com.flexpoker.game.command.events.GameTablesCreatedAndPlayersAssociatedEvent;
import com.flexpoker.game.command.events.NewHandIsClearedToStartEvent;
import com.flexpoker.game.command.events.PlayerMovedToNewTableEvent;
import com.flexpoker.game.command.events.TablePausedForBalancingEvent;
import com.flexpoker.game.command.events.TableResumedAfterBalancingEvent;
import com.flexpoker.game.command.framework.GameEvent;
@Component
public class InMemoryAsyncGameEventPublisher implements EventPublisher<GameEvent> {
private final EventSubscriber<GameEvent> gameEventSubscriber;
private final ProcessManager<GameTablesCreatedAndPlayersAssociatedEvent> createInitialTablesForGameProcessManager;
private final ProcessManager<GameStartedEvent> startFirstHandProcessManager;
private final ProcessManager<NewHandIsClearedToStartEvent> startNewHandForExistingTableProcessManager;
private final ProcessManager<GameStartedEvent> incrementBlindsCountdownProcessManager;
private final ProcessManager<PlayerMovedToNewTableEvent> movePlayerBetweenTablesProcessManager;
private final ProcessManager<TablePausedForBalancingEvent> pauseTableProcessManager;
private final ProcessManager<TableResumedAfterBalancingEvent> resumeTableProcessManager;
@Inject
public InMemoryAsyncGameEventPublisher(
EventSubscriber<GameEvent> gameEventSubscriber,
ProcessManager<GameTablesCreatedAndPlayersAssociatedEvent> createInitialTablesForGameProcessManager,
ProcessManager<GameStartedEvent> startFirstHandProcessManager,
ProcessManager<NewHandIsClearedToStartEvent> startNewHandForExistingTableProcessManager,
ProcessManager<GameStartedEvent> incrementBlindsCountdownProcessManager,
ProcessManager<PlayerMovedToNewTableEvent> movePlayerBetweenTablesProcessManager,
ProcessManager<TablePausedForBalancingEvent> pauseTableProcessManager,
ProcessManager<TableResumedAfterBalancingEvent> resumeTableProcessManager) {
this.gameEventSubscriber = gameEventSubscriber;
this.createInitialTablesForGameProcessManager = createInitialTablesForGameProcessManager;
this.startFirstHandProcessManager = startFirstHandProcessManager;
this.startNewHandForExistingTableProcessManager = startNewHandForExistingTableProcessManager;
this.incrementBlindsCountdownProcessManager = incrementBlindsCountdownProcessManager;
this.movePlayerBetweenTablesProcessManager = movePlayerBetweenTablesProcessManager;
this.pauseTableProcessManager = pauseTableProcessManager;
this.resumeTableProcessManager = resumeTableProcessManager;
}
@Override
public void publish(GameEvent event) {
gameEventSubscriber.receive(event);
if (event
.getClass() == GameTablesCreatedAndPlayersAssociatedEvent.class) {
createInitialTablesForGameProcessManager
.handle((GameTablesCreatedAndPlayersAssociatedEvent) event);
} else if (event.getClass() == GameStartedEvent.class) {
final ProcessManager<GameStartedEvent> localStartFirstHandProcessManager = this.startFirstHandProcessManager;
final Timer timer = new Timer();
final TimerTask timerTask = new TimerTask() {
@Override
public void run() {
localStartFirstHandProcessManager
.handle((GameStartedEvent) event);
}
};
timer.schedule(timerTask, 10000);
incrementBlindsCountdownProcessManager.handle((GameStartedEvent) event);
} else if (event.getClass() == NewHandIsClearedToStartEvent.class) {
startNewHandForExistingTableProcessManager
.handle((NewHandIsClearedToStartEvent) event);
} else if (event.getClass() == PlayerMovedToNewTableEvent.class) {
movePlayerBetweenTablesProcessManager
.handle((PlayerMovedToNewTableEvent) event);
} else if (event.getClass() == TablePausedForBalancingEvent.class) {
pauseTableProcessManager
.handle((TablePausedForBalancingEvent) event);
} else if (event.getClass() == TableResumedAfterBalancingEvent.class) {
resumeTableProcessManager
.handle((TableResumedAfterBalancingEvent) event);
}
}
}