package UE01_030924_Wiederholung;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;

public abstract class Konto {
    private static int kontonummerCounter = 0;
    protected int kontonummer;
    protected double kontostand;
    protected double zinssatz;
    protected ArrayList<String> buchungsvorgaenge = new ArrayList<>();
    String kontoTyp;

    public Konto(double betrag, double zinssatz, String typ) {
        if (kontonummerCounter >= 999999) throw new RuntimeException("Zu viele Konten");
        this.kontostand = betrag;
        this.zinssatz = zinssatz;
        this.kontonummer = ++kontonummerCounter;
        this.kontoTyp = typ;
        this.buchungsvorgaenge.add("Kontoeröffnung: Betrag = " + this.kontostand + ", Zinssatz = " + this.zinssatz + "%");
    }

    public Konto(double zinssatz, String typ) {
        if (kontonummerCounter >= 999999) throw new RuntimeException("Zu viele Konten");
        this.kontostand = 0;
        this.zinssatz = zinssatz;
        this.kontonummer = ++kontonummerCounter;
        this.kontoTyp = typ;
        this.buchungsvorgaenge.add("Kontoeröffnung: Betrag = " + this.kontostand + ", Zinssatz = " + this.zinssatz + "%");
    }

    @Override
    public String toString() {
        return kontonummer(this.kontonummer) + " - " + this.kontoTyp + ": Zinssatz: " + this.zinssatz + "%, Kontostand: " + this.kontostand;
    }

    public void verrechneZinsen() {
        double zins = this.kontostand * (this.zinssatz / 100);
        this.buchungsvorgaenge.add("Zinsen verrechnet: " + zins);
        this.kontostand += zins;
    }

    public void speichereKontoauszug() {
        try {
            Files.write(Paths.get("src/UE01_030924_Wiederholung/auszuege/auszug" + kontonummer(this.kontonummer) + ".txt"), this.buchungsvorgaenge);
        } catch (IOException e) {
            e.getStackTrace();
        }
    }

    public String kontonummer(int kontonummer) {
        return ("000000" + kontonummer).substring(("000000" + kontonummer).length() - 6);
    }

    public abstract double einzahlung(double betrag);

    public double getKontostand() {
        return this.kontostand;
    }
}
