/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see .
*/
package io.bitsquare.trade;
import io.bitsquare.arbitrator.Arbitrator;
import io.bitsquare.bank.BankAccountType;
import io.bitsquare.locale.Country;
import com.google.bitcoin.core.Coin;
import com.google.bitcoin.utils.Fiat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.security.PublicKey;
import java.util.Currency;
import java.util.Date;
import java.util.List;
import java.util.Locale;
//TODO flatten down?
public class Offer implements Serializable {
private static final long serialVersionUID = -971164804305475826L;
// key attributes for lookup
private final Direction direction;
private final Currency currency;
private final String id;
private final Date creationDate;
private final Fiat price;
private final Coin amount;
private final Coin minAmount;
//TODO use hex string
private final PublicKey messagePublicKey;
private final BankAccountType bankAccountType;
private final Country bankAccountCountry;
private final long collateral;
private final List acceptedCountries;
private final List acceptedLanguageLocales;
private final String bankAccountUID;
private final Arbitrator arbitrator;
private String offerFeePaymentTxID;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
public Offer(String id,
PublicKey messagePublicKey,
Direction direction,
Fiat price,
Coin amount,
Coin minAmount,
BankAccountType bankAccountType,
Currency currency,
Country bankAccountCountry,
String bankAccountUID,
Arbitrator arbitrator,
long collateral,
List acceptedCountries,
List acceptedLanguageLocales) {
this.id = id;
this.messagePublicKey = messagePublicKey;
this.direction = direction;
this.price = price;
this.amount = amount;
this.minAmount = minAmount;
this.bankAccountType = bankAccountType;
this.currency = currency;
this.bankAccountCountry = bankAccountCountry;
this.bankAccountUID = bankAccountUID;
this.arbitrator = arbitrator;
this.collateral = collateral;
this.acceptedCountries = acceptedCountries;
this.acceptedLanguageLocales = acceptedLanguageLocales;
creationDate = new Date();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////////////////
public PublicKey getMessagePublicKey() {
return messagePublicKey;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
public String getId() {
return id;
}
public Fiat getPrice() {
return price;
}
public Coin getAmount() {
return amount;
}
public Coin getMinAmount() {
return minAmount;
}
public Direction getDirection() {
return direction;
}
public BankAccountType getBankAccountType() {
return bankAccountType;
}
public Currency getCurrency() {
return currency;
}
public Country getBankAccountCountry() {
return bankAccountCountry;
}
public List getAcceptedCountries() {
return acceptedCountries;
}
public List getAcceptedLanguageLocales() {
return acceptedLanguageLocales;
}
public Fiat getVolumeForCoin(Coin coin) {
BigDecimal amountBD = BigDecimal.valueOf(coin.longValue());
BigDecimal volumeBD = amountBD.multiply(BigDecimal.valueOf(price.longValue() / 10000));
long fiatAsDouble = volumeBD.divide(BigDecimal.valueOf(Coin.COIN.value)).longValue();
return Fiat.valueOf("EUR", fiatAsDouble);
}
public Fiat getOfferVolume() {
return getVolumeForCoin(amount);
}
public Fiat getMinOfferVolume() {
return getVolumeForCoin(minAmount);
}
public String getOfferFeePaymentTxID() {
return offerFeePaymentTxID;
}
public void setOfferFeePaymentTxID(String offerFeePaymentTxID) {
this.offerFeePaymentTxID = offerFeePaymentTxID;
}
public Arbitrator getArbitrator() {
return arbitrator;
}
public long getCollateral() {
return collateral;
}
public String getBankAccountId() {
return bankAccountUID;
}
@Override
public String toString() {
return "Offer{" +
"direction=" + direction +
", currency=" + currency +
", uid='" + id + '\'' +
", price=" + price +
", amount=" + amount +
", minAmount=" + minAmount +
", messagePubKey=" + messagePublicKey.hashCode() +
", bankAccountTypeEnum=" + bankAccountType +
", bankAccountCountryLocale=" + bankAccountCountry +
", collateral=" + collateral +
", acceptedCountryLocales=" + acceptedCountries +
", acceptedLanguageLocales=" + acceptedLanguageLocales +
", offerFeePaymentTxID='" + offerFeePaymentTxID + '\'' +
", bankAccountUID='" + bankAccountUID + '\'' +
", arbitrator=" + arbitrator +
'}';
}
public Date getCreationDate() {
return creationDate;
}
}