package wallettemplate.utils;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.control.Label;
import network.thunder.core.communication.objects.messages.impl.message.gossip.objects.ChannelStatusObject;
import network.thunder.core.communication.objects.messages.impl.message.gossip.objects.PubkeyIPObject;
import network.thunder.core.communication.objects.messages.interfaces.helper.LNEventListener;
import network.thunder.core.database.objects.Channel;
import network.thunder.core.database.objects.PaymentWrapper;
import org.bitcoinj.core.*;
import wallettemplate.Main;
import java.util.Date;
/**
* A class that exposes relevant bitcoin stuff as JavaFX bindable properties.
*/
public class BitcoinUIModel {
public ObservableList<PubkeyIPObject> ipList = FXCollections.observableArrayList();
public ObservableList<Node> channelNetworkList = FXCollections.observableArrayList();
public ObservableList<Channel> channelList = FXCollections.observableArrayList();
public ObservableList<Node> transactionsThunderIncluded = FXCollections.observableArrayList();
public ObservableList<Node> transactionsThunderSettled = FXCollections.observableArrayList();
public ObservableList<Node> transactionsThunderRefunded = FXCollections.observableArrayList();
public ObservableList<Node> transactionsThunderOpen = FXCollections.observableArrayList();
private SimpleObjectProperty<Address> address = new SimpleObjectProperty<>();
public SimpleObjectProperty<Coin> balance = new SimpleObjectProperty<>(Coin.ZERO);
public SimpleObjectProperty<Coin> balanceThunder = new SimpleObjectProperty<>(Coin.ZERO);
public static SimpleDoubleProperty syncProgress = new SimpleDoubleProperty(-1);
private ProgressBarUpdater syncProgressUpdater = new ProgressBarUpdater();
public ObservableList<Node> transactions = FXCollections.observableArrayList();
public BitcoinUIModel () {
}
public void init () {
Main.bitcoin.wallet().addEventListener(new AbstractWalletEventListener() {
@Override
public void onWalletChanged (Wallet wallet) {
super.onWalletChanged(wallet);
update();
}
}, Platform::runLater);
Main.thunderContext.addEventListener(new LNEventListener() {
@Override
public void onEvent () {
new Thread(new Runnable() {
@Override
public void run () {
try {
Thread.sleep(100);
update();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
update();
}
public void update () {
Platform.runLater(() -> {
balance.set(Main.bitcoin.wallet().getBalance(Wallet.BalanceType.AVAILABLE_SPENDABLE));
address.set(Main.bitcoin.wallet().currentReceiveAddress());
ObservableList<Node> items0 = FXCollections.observableArrayList();
for (Transaction p : Main.bitcoin.wallet().getTransactionsByTime()) {
Label label = new Label(p.toString());
items0.add(label);
}
transactionsThunderIncluded.setAll(items0);
ObservableList<Node> items1 = FXCollections.observableArrayList();
for (PaymentWrapper p : Main.dbHandler.getAllPayments()) {
Label label = new Label(p.toString());
items1.add(label);
}
transactionsThunderIncluded.setAll(items1);
ObservableList<Node> items2 = FXCollections.observableArrayList();
for (PaymentWrapper p : Main.dbHandler.getRedeemedPayments()) {
Label label = new Label(p.toString());
items2.add(label);
}
transactionsThunderSettled.setAll(items2);
ObservableList<Node> items3 = FXCollections.observableArrayList();
for (PaymentWrapper p : Main.dbHandler.getRefundedPayments()) {
Label label = new Label(p.toString());
items3.add(label);
}
transactionsThunderRefunded.setAll(items3);
ObservableList<Node> items4 = FXCollections.observableArrayList();
for (PaymentWrapper p : Main.dbHandler.getOpenPayments()) {
Label label = new Label(p.toString());
items4.add(label);
}
transactionsThunderOpen.setAll(items4);
ObservableList<PubkeyIPObject> items5 = FXCollections.observableArrayList();
for (PubkeyIPObject p : Main.dbHandler.getIPObjects()) {
items5.add(p);
}
ipList.setAll(items5);
ObservableList<Node> items6 = FXCollections.observableArrayList();
for (ChannelStatusObject p : Main.dbHandler.getTopology()) {
Label label = new Label(p.toString());
items6.add(label);
}
channelNetworkList.setAll(items6);
long totalAmount = 0;
ObservableList<Channel> items7 = FXCollections.observableArrayList();
for (Channel p : Main.dbHandler.getOpenChannel()) {
totalAmount += p.channelStatus.amountServer;
items7.add(p);
}
balanceThunder.set(Coin.valueOf(totalAmount));
channelList.setAll(items7);
});
}
private class ProgressBarUpdater extends DownloadProgressTracker {
@Override
protected void progress (double pct, int blocksLeft, Date date) {
super.progress(pct, blocksLeft, date);
Platform.runLater(() -> syncProgress.set(pct / 100.0));
}
@Override
protected void doneDownload () {
super.doneDownload();
}
}
public DownloadProgressTracker getDownloadProgressTracker () {
return syncProgressUpdater;
}
public ReadOnlyDoubleProperty syncProgressProperty () {
return syncProgress;
}
public ReadOnlyObjectProperty<Address> addressProperty () {
return address;
}
public ReadOnlyObjectProperty<Coin> balanceProperty () {
return balance;
}
}