import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
/**
 *
 * Beschreibung
 *
 * @version 1.0 vom 31.05.2022
 * @author Gerhard Röhner
 */

public class Block {
  
  // Anfang Attribute
  private int Nr;
  private int Nonce;
  private String Daten;
  private String VorgängerHash;
  private String Hash;
  private int Schwierigkeit;
  // Ende Attribute
  
  public Block(int Nr, int Nonce, String VorgängerHash, String Daten) {
    this.Nr = Nr;
    this.Nonce = Nonce;
    this.Daten = Daten;
    this.VorgängerHash = VorgängerHash;
    this.Hash = "";
    this.Schwierigkeit = 5;
    berechneHash();
  }

  // Anfang Methoden
  public int getNr() {
    return Nr;
  }

  public int getNonce() {
    return Nonce;
  }

  public void setNonce(int NonceNeu) {
    Nonce = NonceNeu;
  }

  public String getDaten() {
    return Daten;
  }

  public void setDaten(String DatenNeu) {
    Daten = DatenNeu;
  }

  public String getVorgängerHash() {
    return VorgängerHash;
  }

  public void setVorgängerHash(String VorgängerHashNeu) {
    VorgängerHash = VorgängerHashNeu;
  }

  public String getHash() {
    return Hash;
  }

  public void setHash(String HashNeu) {
    Hash = HashNeu;
  }

  public int getSchwierigkeit() {
    return Schwierigkeit;
  }

  public void setSchwierigkeit(int SchwierigkeitNeu) {
    Schwierigkeit = SchwierigkeitNeu;
  }

  public void berechneHash() {
    try {
      MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
      String text = Nonce + Nr + Daten + VorgängerHash;
      byte hashBytes[] = messageDigest.digest(text.getBytes(StandardCharsets.UTF_8));
      BigInteger numberHash = new BigInteger(1, hashBytes);
      Hash = numberHash.toString(16); 
      while (Hash.length() != 64)
        Hash = "0" +  Hash; 
    } catch(Exception e) {
      System.out.println(e.getMessage());
    }
  }

  public void mine() {
    Nonce = -1;
    String Start = "";
    for (int i = 0; i < Schwierigkeit; i++) 
      Start = Start + "0";
    do {
      Nonce++;
      berechneHash();
    } while (! Hash.substring(0, Schwierigkeit).equals(Start)); 
  }
  
  public boolean gültig() {
    String Start = "";
    for (int i = 0; i < Schwierigkeit; i++) 
      Start = Start + "0";
    berechneHash();
    return  Hash.substring(0, Schwierigkeit).equals(Start);
  }
    

  public void setNr(int NrNeu) {
    Nr = NrNeu;
  }

  // Ende Methoden
} // end of Block
