package DesignPatterns.strukturellen_Entwurfsmustern.Proxy_Pattern;


//Schritt 1: Definiere das gemeinsame Interface (Subject)
interface Bankkonto {
	void einzahlen(double betrag);

	void abheben(double betrag);
}


//Schritt 2: Erstelle das echte Bankkonto (RealSubject)
class EchtesBankkonto implements Bankkonto {
	private double saldo;

	@Override
	public void einzahlen(double betrag) {
		saldo += betrag;
		System.out.println(betrag + " € eingezahlt. Neuer Kontostand: " + saldo + " €.");
	}

	@Override
	public void abheben(double betrag) {
		if (saldo >= betrag) {
			saldo -= betrag;
			System.out.println(betrag + " € abgehoben. Neuer Kontostand: " + saldo + " €.");
		} else {
			System.out.println("Nicht genügend Guthaben.");
		}
	}
}


//Schritt 3: Erstelle den Proxy
public class BankkontoProxy implements Bankkonto {
	private EchtesBankkonto echtesBankkonto;
	private String zugangscode;

	public BankkontoProxy(String zugangscode) {
		this.echtesBankkonto = new EchtesBankkonto(); // Echtes Konto
		this.zugangscode = zugangscode; // Zugriffskontrolle
	}

	private boolean autorisieren(String eingegebenerCode) {
		return zugangscode.equals(eingegebenerCode); // Vergleich des Sicherheitscodes
	}

	@Override
	public void einzahlen(double betrag) {
		// Sicherheitsprüfung, bevor Zugriff gewährt wird
		System.out.println("Sicherheitsüberprüfung...");
		if (autorisieren("1234")) { // Beispiel: Der Code ist "1234"
			echtesBankkonto.einzahlen(betrag);
		} else {
			System.out.println("Zugriff verweigert: Ungültiger Code.");
		}
	}

	@Override
	public void abheben(double betrag) {
		System.out.println("Sicherheitsüberprüfung...");
		if (autorisieren("1234")) {
			echtesBankkonto.abheben(betrag);
		} else {
			System.out.println("Zugriff verweigert: Ungültiger Code.");
		}
	}

	public static void main(String[] args) {
		// Erstelle einen Proxy mit einem Zugangscode
		Bankkonto bankkonto = new BankkontoProxy("1234");

		// Führe eine Transaktion durch
		bankkonto.einzahlen(100); // Sicherheitsüberprüfung -> Geld wird eingezahlt
		bankkonto.abheben(50); // Sicherheitsüberprüfung -> Geld wird abgehoben

		// Versuch, ohne richtigen Code auf das Konto zuzugreifen
		Bankkonto falscherZugang = new BankkontoProxy("5678");
		falscherZugang.abheben(10); // Sicherheitsüberprüfung -> Zugriff verweigert

	}
}
