package org.jboss.seam.example.seambay;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Transient;
import javax.persistence.Version;
import org.hibernate.validator.NotNull;
@Entity
public class Auction implements Serializable
{
public static final int STATUS_UNLISTED = 0;
public static final int STATUS_LIVE = 1;
public static final int STATUS_COMPLETED = 2;
private static final long serialVersionUID = -8349473227099432431L;
private Integer auctionId;
private Account account;
private Category category;
private String title;
private String description;
private Date endDate;
private AuctionImage image;
private Bid highBid;
private int bids;
private double startingPrice;
private int status;
private int version;
@Id @GeneratedValue
public Integer getAuctionId()
{
return auctionId;
}
public void setAuctionId(Integer auctionId)
{
this.auctionId = auctionId;
}
@NotNull
@ManyToOne
@JoinColumn(name = "ACCOUNT_ID")
public Account getAccount()
{
return account;
}
public void setAccount(Account account)
{
this.account = account;
}
@NotNull
@ManyToOne
@JoinColumn(name = "CATEGORY_ID")
public Category getCategory()
{
return category;
}
public void setCategory(Category category)
{
this.category = category;
}
@NotNull
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
@NotNull
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
@NotNull
public Date getEndDate()
{
return endDate;
}
public void setEndDate(Date endDate)
{
this.endDate = endDate;
}
@OneToOne
@JoinColumn(name = "IMAGE_ID")
public AuctionImage getImage()
{
return image;
}
public void setImage(AuctionImage image)
{
this.image = image;
}
@OneToOne
public Bid getHighBid()
{
return highBid;
}
public void setHighBid(Bid highBid)
{
this.highBid = highBid;
}
public int getBids()
{
return bids;
}
public void setBids(int bids)
{
this.bids = bids;
}
@Transient
public long getTimeLeft()
{
return endDate != null ? (endDate.getTime() - System.currentTimeMillis()) : 0;
}
@Transient
public String getPrettyTimeLeft()
{
long timeLeft = getTimeLeft() / 1000;
int days = (int) Math.floor(timeLeft / (60 * 60 * 24));
timeLeft -= days * 24 * 60 * 60;
int hours = (int) Math.floor(timeLeft / (60 * 60));
timeLeft -= hours * 60 * 60;
int minutes = (int) Math.floor(timeLeft / 60);
StringBuilder sb = new StringBuilder();
if (days > 0)
sb.append(String.format("%dd ", days));
if (hours > 0)
sb.append(String.format("%dh ", hours));
if (minutes > 0)
sb.append(String.format("%dm ", minutes));
return sb.toString();
}
@Transient
public String getDaysHoursLeft()
{
long timeLeft = getTimeLeft() / 1000;
int days = (int) Math.floor(timeLeft / (60 * 60 * 24));
timeLeft -= days * 24 * 60 * 60;
int hours = (int) Math.floor(timeLeft / (60 * 60));
StringBuilder sb = new StringBuilder();
if (days > 0)
sb.append(String.format("%d days ", days));
if (hours > 0)
sb.append(String.format("%d hour", hours));
if (hours > 1)
sb.append('s');
return sb.toString();
}
public double getStartingPrice()
{
return startingPrice;
}
public void setStartingPrice(double startingPrice)
{
this.startingPrice = startingPrice;
}
public int getStatus()
{
return status;
}
public void setStatus(int status)
{
this.status = status;
}
@Version
public int getVersion()
{
return version;
}
public void setVersion(int version)
{
this.version = version;
}
@Transient
public double getCurrentPrice()
{
return highBid != null ? highBid.getActualAmount() : getStartingPrice();
}
@Transient
public double getRequiredBid()
{
return highBid != null ? getRequiredBid(highBid.getActualAmount()) :
getStartingPrice();
}
/**
* Returns the amount required to outbid the specified bid amount.
*
* @param amount The current bid amount
* @return The bid amount required to outbid the current bid
*/
@Transient
static double getRequiredBid(double amount)
{
if (amount < 100)
{
return Math.ceil(amount) + 1;
}
else if (amount < 200)
{
return Math.ceil(amount) + 2;
}
else if (amount < 500)
{
return Math.ceil(amount) + 5;
}
else if (amount < 1000)
{
return Math.ceil(amount) + 10;
}
else if (amount < 5000)
{
return Math.ceil(amount) + 20;
}
else if (amount < 20000)
{
return Math.ceil(amount) + 50;
}
else if (amount < 50000)
{
return Math.ceil(amount) + 100;
}
else if (amount < 100000)
{
return Math.ceil(amount) + 200;
}
else if (amount < 500000)
{
return Math.ceil(amount) + 500;
}
return Math.ceil(amount) + 1000;
}
}