package auction.states;
import auction.Auction;
import auction.AuctionState;
import auction.Bid;
import auction.Moderator;
import auction.Person;
import auction.ReserveAuction;
import auction.User;
import auction.impl.BidImpl;
import auction.impl.MessageImpl;
import auction.impl.ServerImpl;
import auction.impl.UserImpl;
public class Open implements AuctionState {
public static final Open instance = new Open();
public String cancelAuction(Auction auction, Person person) {
return "ERROR: auction open";
}
public void close(Auction auction) {
Bid b = auction.getMaxBid();
if(b!=null && (!(auction instanceof ReserveAuction) || b.getAmount()>=((ReserveAuction)auction).getReservePrice())) {
User seller = auction.getSeller();
User buyer = b.getUser();
int price = b.getAmount();
seller.getAccount().incCredit(price);
buyer.getAccount().decCredit(price);
for(User u: auction.getJoinedUsers())
ServerImpl.instance.send(u, "AUCTION_CLOSED "+auction.getName()+" "+buyer.getEmail()+" "+price);
ServerImpl.instance.send(seller, "AUCTION_CLOSED "+auction.getName()+" "+buyer.getEmail()+" "+price);
}
else {
for(User u: auction.getJoinedUsers())
ServerImpl.instance.send(u, "AUCTION_CLOSED "+auction.getName()+" not selled");
ServerImpl.instance.send(auction.getSeller(), "AUCTION_CLOSED "+auction.getName()+" not selled");
}
auction.setState(Closed.instance);
}
public String getCurrentBid(Auction auction) {
Bid b = auction.getMaxBid();
if (b!=null)
return b.toString();
else
return "ERROR: no current bid";
}
public String getName() {
return "OPEN";
}
public String join(Auction auction, User user) {
if(auction.getJoinedUsers().contains(user))
return "ERROR: auction already joined";
auction.getJoinedUsers().add(user);
user.getJoinedAuctions().add(auction);
return "OK";
}
public String leave(Auction auction, User user) {
if(!auction.getJoinedUsers().contains(user))
return "ERROR: auction not joined";
Bid b = auction.getMaxBid();
if(b!=null && b.getUser()==user)
return "ERROR: you cannot leave an auction when you have the best bid";
auction.getJoinedUsers().remove(user);
user.getJoinedAuctions().remove(auction);
return "OK";
}
public void open(Auction auction) {
throw new Error("Cannot open an open auction");
}
public String placeBid(Auction auction, UserImpl user, int amount) {
if(amount<auction.minimumAmount())
return "ERROR: insufficient amount";
if(amount>user.getAccount().getFreeCredit()+(auction.getMaxBid()!=null && auction.getMaxBid().getUser()==user ? auction.getMaxBid().getAmount() : 0 ))
return "ERROR: insufficient free credit";
new BidImpl(user,auction,amount);
for(User u : auction.getJoinedUsers())
ServerImpl.instance.send(u, "BID "+auction.getName()+" "+user.getEmail()+" "+amount);
return "OK";
}
public String postMessage(Auction auction, Person person, String message){
if(auction.getSeller()!=person && !(person instanceof Moderator) && !auction.getJoinedUsers().contains(person))
return "ERROR: you cannot post on this bulletin board";
new MessageImpl(auction.getBulletinBoard(),person,message);
for(User u: auction.getJoinedUsers())
ServerImpl.instance.send(u, "MESSAGE "+auction.getName()+" "+person.getEmail()+" "+message);
return "OK";
}
public String setDesc(Auction auction, Person person, String value) {
return "ERROR: auctions is open";
}
public String setEndDate(Auction auction, Person person, int value) {
return "ERROR: auctions is open";
}
public String setMinBid(Auction auction, Person person, int value) {
return "ERROR: auctions is open";
}
public String setResPrice(ReserveAuction auction, Person person, int value) {
return "ERROR: auctions is open";
}
public String setStartDate(Auction auction, Person person, int value) {
return "ERROR: auctions is open";
}
}