package UE01_030924_Wiederholung;

import static org.junit.jupiter.api.Assertions.*;

public class BankwesenTest {
    public static void main(String[] args) {
        Girokonto girokonto = new Girokonto("AlexArm", 5);
        Girokonto girokonto1 = new Girokonto("AlexReich", 1000, -5);
        Girokonto girokonto2 = new Girokonto(null, -100, 0);

        Kreditkonto kreditkonto = new Kreditkonto("AlexArm", 5, -1000);
        Kreditkonto kreditkonto1 = new Kreditkonto("AlexReich", 5, 1000);
        Kreditkonto kreditkonto2 = new Kreditkonto(null, -5, 0);

        Sparbuch sparbuch = new Sparbuch(1000, 2);
        Sparbuch sparbuch1 = new Sparbuch(-1000, 5);
        Sparbuch sparbuch2 = new Sparbuch(5);

        testGirokonto(girokonto, girokonto1, girokonto2);
        System.out.println("Girokonto Tests erfolgreich!");
        testKreditkonto(kreditkonto, kreditkonto1, kreditkonto2);
        System.out.println("Kreditkonto Tests erfolgreich!");
        testSparbuch(sparbuch, sparbuch1, sparbuch2);
        System.out.println("Sparbuch Tests erfolgreich!");

        girokonto.speichereKontoauszug();
        girokonto1.speichereKontoauszug();
        girokonto2.speichereKontoauszug();

        kreditkonto.speichereKontoauszug();
        kreditkonto1.speichereKontoauszug();
        kreditkonto2.speichereKontoauszug();

        sparbuch.speichereKontoauszug();
        sparbuch1.speichereKontoauszug();
        sparbuch2.speichereKontoauszug();

        System.out.println("\nGesamt Summe: " + berechneSumme(girokonto, girokonto1, girokonto2, kreditkonto, kreditkonto1, kreditkonto2, sparbuch, sparbuch1, sparbuch2));
    }

    public static void testGirokonto(Girokonto girokonto, Girokonto girokonto1, Girokonto girokonto2) {
        assertEquals(0, girokonto.einzahlung(-100));
        assertEquals(0, girokonto.getKontostand());
        assertEquals(100, girokonto.einzahlung(100));
        assertEquals(100, girokonto.getKontostand());

        assertFalse(girokonto.auszahlung(2000));
        assertEquals(100, girokonto.getKontostand());
        assertTrue(girokonto1.auszahlung(200));
        assertEquals(800, girokonto1.getKontostand());

        assertEquals(800, girokonto1.getKontostand());
        assertEquals(100, girokonto.getKontostand());
        assertEquals(50, girokonto1.ueberweisung(girokonto, 50));
        assertEquals(750, girokonto1.getKontostand());
        assertEquals(150, girokonto.getKontostand());
        assertEquals(0, girokonto1.ueberweisung(girokonto, 5000));
        assertEquals(750, girokonto1.getKontostand());
        assertEquals(150, girokonto.getKontostand());
        assertEquals(0, girokonto1.ueberweisung(girokonto, -100));
        assertEquals(750, girokonto1.getKontostand());
        assertEquals(150, girokonto.getKontostand());

        assertEquals("000001 - Girokonto von AlexArm: Zinssatz: 5.0%, Kontostand: 150.0", girokonto.toString());
        assertEquals("000002 - Girokonto von AlexReich: Zinssatz: -5.0%, Kontostand: 750.0", girokonto1.toString());
        assertEquals("000003 - Girokonto von undefined: Zinssatz: 0.0%, Kontostand: -100.0", girokonto2.toString());

        girokonto.verrechneZinsen();
        girokonto1.verrechneZinsen();
        girokonto2.verrechneZinsen();

        assertEquals("000001 - Girokonto von AlexArm: Zinssatz: 5.0%, Kontostand: 157.5", girokonto.toString());
        assertEquals("000002 - Girokonto von AlexReich: Zinssatz: -5.0%, Kontostand: 712.5", girokonto1.toString());
        assertEquals("000003 - Girokonto von undefined: Zinssatz: 0.0%, Kontostand: -100.0", girokonto2.toString());
    }

    public static void testKreditkonto(Kreditkonto kreditkonto, Kreditkonto kreditkonto1, Kreditkonto kreditkonto2) {
        assertEquals(0, kreditkonto.einzahlung(-100));
        assertEquals(-1000, kreditkonto.getKontostand());
        assertEquals(100, kreditkonto.einzahlung(100));
        assertEquals(-900, kreditkonto.getKontostand());
        assertEquals(0, kreditkonto1.einzahlung(-100));
        assertEquals(-1000, kreditkonto1.getKontostand());
        assertEquals(100, kreditkonto1.einzahlung(100));
        assertEquals(-900, kreditkonto1.getKontostand());
        assertEquals("000004 - Kreditkonto von AlexArm: Zinssatz: 5.0%, Kontostand: -900.0", kreditkonto.toString());
        assertEquals("000005 - Kreditkonto von AlexReich: Zinssatz: 5.0%, Kontostand: -900.0", kreditkonto1.toString());
        assertEquals("000006 - Kreditkonto von undefined: Zinssatz: -5.0%, Kontostand: -0.0", kreditkonto2.toString());
        assertEquals(900, kreditkonto.einzahlung(900));
        assertEquals(0, kreditkonto.getKontostand());
        assertEquals(900, kreditkonto1.einzahlung(1000));
        assertEquals(0, kreditkonto1.getKontostand());
    }

    public static void testSparbuch(Sparbuch sparbuch, Sparbuch sparbuch1, Sparbuch sparbuch2) {
        assertEquals(sparbuch.einzahlung(-100), 0);
        assertEquals(sparbuch.getKontostand(), 1000);
        assertEquals(sparbuch.einzahlung(100), 100);
        assertEquals(sparbuch.getKontostand(), 1100);

        assertTrue(sparbuch.auszahlung(100));
        assertEquals(sparbuch.getKontostand(), 1000);
        assertFalse(sparbuch1.auszahlung(200));
        assertEquals(sparbuch1.getKontostand(), -1000);
        assertEquals(sparbuch.toString(), "000007 - Sparbuch: Zinssatz: 2.0%, Kontostand: 1000.0");
        assertEquals(sparbuch1.toString(), "000008 - Sparbuch: Zinssatz: 5.0%, Kontostand: -1000.0");
        assertEquals(sparbuch2.toString(), "000009 - Sparbuch: Zinssatz: 5.0%, Kontostand: 0.0");
    }

    public static double berechneSumme(Konto... kontos) {
        double summe = 0;
        for (Konto konto : kontos) summe += konto.getKontostand();
        return summe;
    }
}