package market.guess.ui.console.command; import java.math.BigDecimal; import market.guess.api.CatalogContext; import market.guess.api.GuessMarketContext; import market.guess.model.event.EventStatus; import market.guess.ui.console.io.InputProcessor; public final class PlaceOrderMenuCommand implements MenuCommand { private final GuessMarketContext context; private final CatalogContext catalog; private final InputProcessor io; public PlaceOrderMenuCommand( GuessMarketContext context, CatalogContext catalog, InputProcessor io) { super(); this.context = context; this.catalog = catalog; this.io = io; } @Override public int getIndex() { return 4; } @Override public String getName() { return "Place a buy order on an event"; } @Override public void execute() { var result = catalog.getAllEvents(); if (!result.isSuccess()) { io.println("Failed to list events: %s.".formatted(result.getMessage())); return; } var events = result.getData(); if (events.isEmpty()) { io.println("No events are currently loaded. Please load a valid XML file first."); return; } var active = events.stream().filter(event -> event.status() == EventStatus.ACTIVE).toList(); if (active.isEmpty()) { io.println("There are currently no active events to trade on."); return; } io.newLine(); io.println("Active events:"); var pick = io.readSelect("Pick an active event: ", active, event -> "[ID: %d] %s".formatted(event.displayId(), event.name())); var result2 = catalog.getEvent(pick.key()); var event = result2.getData(); if (event == null) { io.println("That event is no longer available."); return; } io.printState(event.state()); var market = io.readSelect( "Choose an option to buy: ", event.state().markets(), o -> "%s [current value: %s, %s shares purchased]".formatted(o.name(), o.price(), o.volume())); var amount = io.readInt("How many shares would you like to buy? ", 1, Integer.MAX_VALUE); var buyResult = context.placeOrder( "Tester", event.summary().key(), market.key(), new BigDecimal(market.price()), amount); if (buyResult.isSuccess()) { io.printReceipt(buyResult.getData()); return; } io.newLine(); io.println("Purchase declined: %s".formatted(buyResult.getMessage())); } }