package network.thunder.core.etc;
import network.thunder.core.communication.objects.lightning.subobjects.ChannelStatus;
import network.thunder.core.communication.objects.subobjects.PaymentSecret;
import network.thunder.core.database.objects.Channel;
import network.thunder.core.database.objects.PaymentWrapper;
import network.thunder.core.lightning.RevocationHash;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by matsjerratsch on 13/01/2016.
*/
public class LNPaymentDBHandlerMock extends DBHandlerMock {
public static final long INITIAL_AMOUNT_CHANNEL = 10000000;
List<PaymentWrapper> payments = new ArrayList<>();
List<PaymentSecret> secrets = new ArrayList<>();
@Override
public Channel getChannel (byte[] node) {
Channel channel = new Channel();
channel.nodeId = node;
channel.channelStatus = new ChannelStatus();
channel.amountServer = INITIAL_AMOUNT_CHANNEL;
channel.amountClient = INITIAL_AMOUNT_CHANNEL;
channel.channelStatus.amountServer = INITIAL_AMOUNT_CHANNEL;
channel.channelStatus.amountClient = INITIAL_AMOUNT_CHANNEL;
return channel;
}
@Override
public void addPayment (PaymentWrapper paymentWrapper) {
if (payments.contains(paymentWrapper)) {
throw new RuntimeException("Double payment added?");
}
payments.add(paymentWrapper);
}
@Override
public void updatePayment (PaymentWrapper paymentWrapper) {
for (PaymentWrapper p : payments) {
if (p.equals(paymentWrapper)) {
p.paymentData = paymentWrapper.paymentData;
p.receiver = paymentWrapper.receiver;
p.sender = paymentWrapper.sender;
p.statusReceiver = paymentWrapper.statusReceiver;
p.statusSender = paymentWrapper.statusSender;
}
}
}
@Override
public void updatePaymentSender (PaymentWrapper paymentWrapper) {
for (PaymentWrapper p : payments) {
if (p.equals(paymentWrapper)) {
p.paymentData = paymentWrapper.paymentData;
p.statusSender = paymentWrapper.statusSender;
}
}
}
@Override
public void updatePaymentReceiver (PaymentWrapper paymentWrapper) {
for (PaymentWrapper p : payments) {
if (p.equals(paymentWrapper)) {
p.paymentData = paymentWrapper.paymentData;
p.statusReceiver = paymentWrapper.statusReceiver;
}
}
}
@Override
public void updatePaymentAddReceiverAddress (PaymentSecret secret, byte[] receiver) {
for (PaymentWrapper p : payments) {
if (p.paymentData.secret.equals(secret)) {
p.receiver = receiver;
}
}
}
@Override
public PaymentWrapper getPayment (PaymentSecret paymentSecret) {
System.out.println(payments.size());
for (PaymentWrapper payment : payments) {
if (payment.paymentData.secret.equals(paymentSecret)) {
return payment;
}
}
return null;
}
@Override
public void addPaymentSecret (PaymentSecret secret) {
if (secrets.contains(secret)) {
PaymentSecret oldSecret = secrets.get(secrets.indexOf(secret));
oldSecret.secret = secret.secret;
} else {
secrets.add(secret);
}
}
@Override
public PaymentSecret getPaymentSecret (PaymentSecret secret) {
if (!secrets.contains(secret)) {
return null;
}
return secrets.get(secrets.indexOf(secret));
}
@Override
public byte[] getSenderOfPayment (PaymentSecret paymentSecret) {
for (PaymentWrapper payment : payments) {
if (payment.paymentData.secret.equals(paymentSecret)) {
return payment.sender;
}
}
return null;
}
@Override
public byte[] getReceiverOfPayment (PaymentSecret paymentSecret) {
for (PaymentWrapper payment : payments) {
if (payment.paymentData.secret.equals(paymentSecret)) {
return payment.receiver;
}
}
return null;
}
@Override
public RevocationHash createRevocationHash (Channel channel) {
byte[] secret = new byte[20];
new Random().nextBytes(secret);
byte[] secretHash = Tools.hashSecret(secret);
RevocationHash hash = new RevocationHash(1, 1, secret, secretHash);
return hash;
}
@Override
public List<RevocationHash> getOldRevocationHashes (Channel channel) {
return new ArrayList<>();
}
}