package com.flexpoker.table.command.aggregate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.springframework.stereotype.Component;
import com.flexpoker.exception.FlexPokerException;
import com.flexpoker.table.command.commands.CreateTableCommand;
import com.flexpoker.table.command.events.TableCreatedEvent;
import com.flexpoker.table.command.factory.TableFactory;
import com.flexpoker.table.command.framework.TableEvent;
@Component
public class DefaultTableFactory implements TableFactory {
@Override
public Table createNew(CreateTableCommand command) {
int numberOfPlayersPerTable = command.getNumberOfPlayersPerTable();
Map<Integer, UUID> seatMap = new HashMap<>();
for (int i = 0; i < numberOfPlayersPerTable; i++) {
seatMap.put(i, null);
}
Set<UUID> playerIds = command.getPlayerIds();
if (playerIds.size() < 2) {
throw new FlexPokerException("must have at least two players");
}
if (playerIds.size() > seatMap.size()) {
throw new FlexPokerException(
"player list can't be larger than seatMap");
}
// TODO: randomize the seat placement
List<UUID> playerIdsList = new ArrayList<>(playerIds);
for (int i = 0; i < playerIds.size(); i++) {
seatMap.put(Integer.valueOf(i), playerIdsList.get(i));
}
// TODO: add starting chips as a parameter, probably once blind
// scheduling gets introduced
return createWithGivenInfo(false, command.getTableId(),
command.getGameId(), seatMap, 1500);
}
@Override
public Table createFrom(List<TableEvent> events) {
TableCreatedEvent tableCreatedEvent = (TableCreatedEvent) events.get(0);
Table table = createWithGivenInfo(true,
tableCreatedEvent.getAggregateId(),
tableCreatedEvent.getGameId(),
tableCreatedEvent.getSeatPositionToPlayerMap(),
tableCreatedEvent.getStartingNumberOfChips());
table.applyAllHistoricalEvents(events);
return table;
}
private Table createWithGivenInfo(boolean creatingFromEvents,
UUID aggregateId, UUID gameId, Map<Integer, UUID> seatMap,
int startingNumberOfChips) {
return new Table(creatingFromEvents, aggregateId, gameId, seatMap,
startingNumberOfChips);
}
}