import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.scene.control.*;
import je.NumberField;
import javafx.event.*;
import javafx.scene.input.*;

/**
 *
 * Beschreibung
 *
 * @version 1.0 vom 09.06.2022
 * @author 
 */

public class GuiWallet extends Application {
  // Anfang Attribute
  private Label lEigentuemer = new Label();
  private TextField tfEigentuemer = new TextField();
  private Label lKontostand = new Label();
  private NumberField nfKontostand = new NumberField();
  private Label lOeffentlicherSchluesselBase64 = new Label();
  private Label lTransaktion = new Label();
  private Label lBTC = new Label();
  private Label lEmpfaenger = new Label();
  private TextField tfEmpfaenger = new TextField();
  private Label lBetrag = new Label();
  private NumberField nfBetrag = new NumberField();
  private Label lBTC1 = new Label();
  private Button bSignieren = new Button();
  private Label lSignaturBase64 = new Label();
  private TextField tfPublicKey = new TextField();
  private TextField tfSignatur = new TextField();
  private Button bVerifizieren = new Button();
  private Button bAusfuehren = new Button();
  private TextField tfMeldung = new TextField();
  // Ende Attribute
  private Wallet einWallet = new Wallet("Gerhard", 10);
  
  public void start(Stage primaryStage) { 
    Pane root = new Pane();
    Scene scene = new Scene(root, 897, 348);
    // Anfang Komponenten
    
    lEigentuemer.setLayoutX(8);
    lEigentuemer.setLayoutY(10);
    lEigentuemer.setPrefHeight(20);
    lEigentuemer.setPrefWidth(78);
    lEigentuemer.setText("Eigentümer");
    root.getChildren().add(lEigentuemer);
    tfEigentuemer.setLayoutX(88);
    tfEigentuemer.setLayoutY(8);
    tfEigentuemer.setPrefHeight(25);
    tfEigentuemer.setPrefWidth(150);
    root.getChildren().add(tfEigentuemer);
    lKontostand.setLayoutX(8);
    lKontostand.setLayoutY(42);
    lKontostand.setPrefHeight(20);
    lKontostand.setPrefWidth(78);
    lKontostand.setText("Kontostand");
    root.getChildren().add(lKontostand);
    nfKontostand.setLayoutX(88);
    nfKontostand.setLayoutY(40);
    nfKontostand.setPrefHeight(25);
    nfKontostand.setPrefWidth(150);
    root.getChildren().add(nfKontostand);
    lOeffentlicherSchluesselBase64.setLayoutX(8);
    lOeffentlicherSchluesselBase64.setLayoutY(80);
    lOeffentlicherSchluesselBase64.setPrefHeight(20);
    lOeffentlicherSchluesselBase64.setPrefWidth(206);
    lOeffentlicherSchluesselBase64.setText("Öffentlicher Schlüssel (Base64)");
    root.getChildren().add(lOeffentlicherSchluesselBase64);
    lTransaktion.setLayoutX(8);
    lTransaktion.setLayoutY(144);
    lTransaktion.setPrefHeight(20);
    lTransaktion.setPrefWidth(110);
    lTransaktion.setText("Transaktion");
    root.getChildren().add(lTransaktion);
    lBTC.setLayoutX(248);
    lBTC.setLayoutY(42);
    lBTC.setPrefHeight(20);
    lBTC.setPrefWidth(38);
    lBTC.setText("BTC");
    root.getChildren().add(lBTC);
    lEmpfaenger.setLayoutX(8);
    lEmpfaenger.setLayoutY(170);
    lEmpfaenger.setPrefHeight(20);
    lEmpfaenger.setPrefWidth(78);
    tfEmpfaenger.setLayoutX(88);
    tfEmpfaenger.setLayoutY(168);
    tfEmpfaenger.setPrefHeight(25);
    tfEmpfaenger.setPrefWidth(150);
    lEmpfaenger.setText("Empfänger");
    root.getChildren().add(lEmpfaenger);
    tfEmpfaenger.setText("Doris");
    root.getChildren().add(tfEmpfaenger);
    lBetrag.setLayoutX(8);
    lBetrag.setLayoutY(200);
    lBetrag.setPrefHeight(20);
    lBetrag.setPrefWidth(78);
    lBetrag.setText("Betrag");
    root.getChildren().add(lBetrag);
    nfBetrag.setLayoutX(88);
    nfBetrag.setLayoutY(200);
    nfBetrag.setPrefHeight(25);
    nfBetrag.setPrefWidth(150);
    lBTC1.setLayoutX(248);
    lBTC1.setLayoutY(202);
    lBTC1.setPrefHeight(20);
    lBTC1.setPrefWidth(38);
    nfBetrag.setText("2");
    root.getChildren().add(nfBetrag);
    lBTC1.setText("BTC");
    root.getChildren().add(lBTC1);
    bSignieren.setLayoutX(16);
    bSignieren.setLayoutY(304);
    bSignieren.setPrefHeight(25);
    bSignieren.setPrefWidth(91);
    bSignieren.setOnAction(
      (event) -> {bSignieren_Action(event);} 
    );
    bSignieren.setText("Signieren");
    root.getChildren().add(bSignieren);
    lSignaturBase64.setLayoutX(8);
    lSignaturBase64.setLayoutY(240);
    lSignaturBase64.setPrefHeight(20);
    lSignaturBase64.setPrefWidth(134);
    lSignaturBase64.setText(" Signatur (Base64)");
    root.getChildren().add(lSignaturBase64);
    primaryStage.setOnShowing(
      (event) -> {primaryStage_Showing(event);} 
    );
    tfPublicKey.setLayoutX(8);
    tfPublicKey.setLayoutY(104);
    tfPublicKey.setPrefHeight(25);
    tfPublicKey.setPrefWidth(886);
    root.getChildren().add(tfPublicKey);
    tfSignatur.setLayoutX(8);
    tfSignatur.setLayoutY(264);
    tfSignatur.setPrefHeight(25);
    tfSignatur.setPrefWidth(886);
    root.getChildren().add(tfSignatur);
    bVerifizieren.setLayoutX(224);
    bVerifizieren.setLayoutY(304);
    bVerifizieren.setPrefHeight(25);
    bVerifizieren.setPrefWidth(91);
    bVerifizieren.setOnAction(
      (event) -> {bVerifizieren_Action(event);} 
    );
    bVerifizieren.setText("Verifizieren");
    root.getChildren().add(bVerifizieren);
    bAusfuehren.setLayoutX(120);
    bAusfuehren.setLayoutY(304);
    bAusfuehren.setPrefHeight(25);
    bAusfuehren.setPrefWidth(91);
    bAusfuehren.setOnAction(
      (event) -> {bAusfuehren_Action(event);} 
    );
    bAusfuehren.setText("Ausführen");
    root.getChildren().add(bAusfuehren);
    tfMeldung.setLayoutX(328);
    tfMeldung.setLayoutY(304);
    tfMeldung.setPrefHeight(25);
    tfMeldung.setPrefWidth(286);
    root.getChildren().add(tfMeldung);
    // Ende Komponenten
    
    primaryStage.setOnCloseRequest(e -> System.exit(0));
    primaryStage.setTitle("GuiWallet");
    primaryStage.setScene(scene);
    primaryStage.show();
  } // end of public GuiWallet
  
  // Anfang Methoden
  
  public static void main(String[] args) {
    launch(args);
  } 
  
  public void ModelToView() {
    tfEigentuemer.setText(einWallet.getEigentümer());
    nfKontostand.setDouble(einWallet.getKontostand());
    tfPublicKey.setText(einWallet.getPublicKeyBase64());
  }
  
  public void bSignieren_Action(Event evt) {
    String Empfänger = tfEmpfaenger.getText();
    double Betrag = nfBetrag.getDouble();
    String Transaktion = einWallet.erstelleTransaktion(Empfänger, Betrag);
    String Signatur = einWallet.signieren(Transaktion);
    tfSignatur.setText(Signatur);
  } 
                      
  public void primaryStage_Showing(Event evt) {
    ModelToView();
  } 

  public void bVerifizieren_Action(Event evt) {
    String publicKeyBase64 = einWallet.getPublicKeyBase64();
    String Transaktion = einWallet.getTransaktion();
    String signatureBase64 = tfSignatur.getText();
    if (einWallet.verifizieren(Transaktion, publicKeyBase64, signatureBase64))
      tfMeldung.setText("gültige Signatur");
    else
      tfMeldung.setText("ungültige Signatur");
  } 

  public void bAusfuehren_Action(Event evt) {
    if (einWallet.TransaktionAusführen())
      tfMeldung.setText("Transaktion ausgeführt");
    else 
      tfMeldung.setText("ungültige Transaktion");
  } 

  // Ende Methoden
} 
