package net.scapeemulator.game.content.grandexchange;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;
import net.scapeemulator.game.GameServer;
import net.scapeemulator.game.dispatcher.button.ButtonDispatcher;
import net.scapeemulator.game.model.World;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.msg.impl.GrandExchangeUpdateMessage;
public class GrandExchange {
private final ArrayList<HashMap<Integer, TreeSet<GEOffer>>> offerMaps = new ArrayList<HashMap<Integer, TreeSet<GEOffer>>>();
public GrandExchange() {
offerMaps.add(new HashMap<Integer, TreeSet<GEOffer>>());
offerMaps.add(new HashMap<Integer, TreeSet<GEOffer>>());
ButtonDispatcher.getInstance().bind(new GEInterfaceHandler());
}
public GEOffer placeOffer(int playerId, int slot, OfferType type, int itemId, int price, int amt, long time) {
GEOffer offer = new GEOffer(playerId, slot, type, itemId, price, amt, new Timestamp(time));
HashMap<Integer, TreeSet<GEOffer>> typeOffers = offerMaps.get(Math.abs(type.ordinal() - 1));
if (typeOffers.containsKey(itemId)) {
Iterator<GEOffer> offers = typeOffers.get(itemId).iterator();
while (offers.hasNext() && offer.active()) {
GEOffer compareOffer = offers.next();
if ((compareOffer.getPrice() > price && type == OfferType.BUY) || (compareOffer.getPrice() < price && type == OfferType.SELL)) {
break;
}
if (!compareOffer.active()) {
continue;
}
int updateAmount = compareOffer.getAmountRemaining() >= offer.getAmountRemaining() ? offer.getAmountRemaining() : compareOffer.getAmountRemaining();
offer.update(updateAmount, compareOffer.getPrice());
compareOffer.update(updateAmount, compareOffer.getPrice());
GameServer.getInstance().getSerializer().saveGrandExchangeOffer(compareOffer);
Player compareOfferOwner = World.getWorld().getPlayerByDatabaseId(compareOffer.getPlayerId());
if (compareOfferOwner != null) {
compareOfferOwner.send(new GrandExchangeUpdateMessage(compareOffer));
}
}
}
addOffer(offer);
GameServer.getInstance().getSerializer().saveGrandExchangeOffer(offer);
return offer;
}
public GEOffer[] getPlayerOffers(int playerId) {
GEOffer[] playerOffers = new GEOffer[6];
for (HashMap<Integer, TreeSet<GEOffer>> offerMap : offerMaps) {
for (TreeSet<GEOffer> offerSet : offerMap.values()) {
Iterator<GEOffer> offers = offerSet.iterator();
while (offers.hasNext()) {
GEOffer offer = offers.next();
if (offer.getPlayerId() == playerId) {
playerOffers[offer.getSlot()] = offer;
}
}
}
}
return playerOffers;
}
public void addOffer(GEOffer offer) {
HashMap<Integer, TreeSet<GEOffer>> offerMap = offerMaps.get(offer.getType().ordinal());
TreeSet<GEOffer> offerList = offerMap.get(offer.getItemId());
if (offerList == null) {
offerList = new TreeSet<GEOffer>();
offerMap.put(offer.getItemId(), offerList);
}
offerList.add(offer);
}
public void removeOffer(GEOffer offer) {
HashMap<Integer, TreeSet<GEOffer>> offerMap = offerMaps.get(offer.getType().ordinal());
TreeSet<GEOffer> offerList = offerMap.get(offer.getItemId());
GameServer.getInstance().getSerializer().removeGrandExchangeOffer(offer);
offerList.remove(offer);
}
public ArrayList<HashMap<Integer, TreeSet<GEOffer>>> getOfferMaps() {
return offerMaps;
}
}