package qora.naming;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import org.json.simple.JSONObject;
import com.google.common.primitives.Bytes;
import com.google.common.primitives.Ints;
import database.DBSet;
public class NameSale
{
private static final int NAME_SIZE_LENGTH = 4;
private static final int AMOUNT_LENGTH = 8;
private String key;
private BigDecimal amount;
public NameSale(String key, BigDecimal amount)
{
this.key = key;
this.amount = amount;
}
//GETTERS/SETTERS
public String getKey()
{
return key;
}
public Name getName(DBSet db)
{
return db.getNameMap().get(this.key);
}
public Name getName()
{
return this.getName(DBSet.getInstance());
}
public BigDecimal getAmount()
{
return this.amount;
}
//PARSE
public static NameSale Parse(byte[] data) throws Exception
{
int position = 0;
//READ NAME
byte[] nameLengthBytes = Arrays.copyOfRange(data, position, position + NAME_SIZE_LENGTH);
int nameLength = Ints.fromByteArray(nameLengthBytes);
position += NAME_SIZE_LENGTH;
if(nameLength < 1 || nameLength > 400)
{
throw new Exception("Invalid name length");
}
byte[] nameBytes = Arrays.copyOfRange(data, position, position + nameLength);
String nameName = new String(nameBytes, StandardCharsets.UTF_8);
position += nameLength;
//READ AMOUNT
byte[] amountBytes = Arrays.copyOfRange(data, position, position + AMOUNT_LENGTH);
BigDecimal amount = new BigDecimal(new BigInteger(amountBytes), 8);
position += AMOUNT_LENGTH;
return new NameSale(nameName, amount);
}
@SuppressWarnings("unchecked")
public JSONObject toJson()
{
//GET BASE
JSONObject nameSale = new JSONObject();
//ADD NAME/AMOUNT/OWNER
nameSale.put("name", this.getKey());
nameSale.put("amount", this.getAmount().toPlainString());
nameSale.put("seller", this.getName().getOwner().getAddress());
return nameSale;
}
public byte[] toBytes()
{
byte[] data = new byte[0];
//WRITE NAME SIZE
byte[] nameBytes = this.key.getBytes(StandardCharsets.UTF_8);
int nameLength = nameBytes.length;
byte[] nameLengthBytes = Ints.toByteArray(nameLength);
data = Bytes.concat(data, nameLengthBytes);
//WRITE NAME
data = Bytes.concat(data, nameBytes);
//WRITE AMOUNT
byte[] amountBytes = this.amount.unscaledValue().toByteArray();
byte[] fill = new byte[AMOUNT_LENGTH - amountBytes.length];
amountBytes = Bytes.concat(fill, amountBytes);
data = Bytes.concat(data, amountBytes);
return data;
}
public int getDataLength()
{
byte[] nameBytes = this.key.getBytes(StandardCharsets.UTF_8);
int nameLength = nameBytes.length;
return NAME_SIZE_LENGTH + nameLength + AMOUNT_LENGTH;
}
//REST
@Override
public String toString()
{
return this.key;
}
}