package dialog;

import bean.Kreditgeber;
import bean.KreditgeberCheck1;
import bean.KreditgeberCheck2;
import bean.Kunde;
import bean.KundeCheck1;
import bean.KundeCheck2;
import bean.KundeCheck3;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import validierung.MeinValidierer;

public class Main {

  private List<Kunde> kunden = new ArrayList<Kunde>();
  MeinValidierer<Kunde> valKunde = new MeinValidierer<Kunde>();
  MeinValidierer<Kreditgeber> valKredit = new MeinValidierer<Kreditgeber>();

  public void dialog() {
    int eingabe = -1;
    while (eingabe != 0) {
      System.out.println("Was wollen Sie\n"
              + " (0) Programm beenden\n"
              + " (1) Kunden ergänzen");
      if (kunden.size() > 0) {
        System.out.println(" (2) Kredit für Kunden ergänzen");
      }
      System.out.println(" (3) Gesamtübersicht");
      eingabe = Eingabe.leseInt();
      switch (eingabe) {
        case 1:
          kundeErgaenzen();
          break;
        case 2:
          if (kunden.size() > 0) {
            kreditFuerKundeErgaenzen();
          }
          break;
        case 3:
          uebersicht();
          break;
      }
    }
  }

  public void kundeErgaenzen() {
    Kunde k = new Kunde();
    boolean ok = false;
    while (!ok) {
      System.out.print("Name: ");
      k.setName(Eingabe.leseString());
      int fehler = valKunde.analyse(k, KundeCheck1.class);
      if (fehler == 0) {
        ok = true;
      }
    }
    ok = false;
    while (!ok) {
      System.out.print("Kreditrahmen: ");
      k.setMaxKredit(new BigInteger(Eingabe.leseString())); // Exception Handling fehlt
      int fehler = valKunde.analyse(k, KundeCheck2.class);
      if (fehler == 0) {
        ok = true;
      }
    }
    kunden.add(k);
  }

  private Kunde kundeWaehlen() {
    for (int i = 0; i < kunden.size(); i++) {
      System.out.println((i + 1) + " " + kunden.get(i).getName());
    }
    int eingabe = -1;
    while (eingabe < 1 || eingabe > kunden.size()) {
      System.out.print("Welcher Kunde: ");
      eingabe = Eingabe.leseInt();
    }
    return kunden.get(eingabe - 1);
  }

  private void kreditFuerKundeErgaenzen() {
    Kunde k = kundeWaehlen();
    Kreditgeber kg = new Kreditgeber();
    boolean ok = false;
    while (!ok) {
      System.out.print("Name Kreditgeber: ");
      kg.setName(Eingabe.leseString());
      int fehler = valKredit.analyse(kg, KreditgeberCheck1.class);
      if (fehler == 0) {
        ok = true;
      }
    }
    ok = false;
    while (!ok) {
      System.out.print("Kreditsumme: ");
      kg.setSumme(new BigInteger(Eingabe.leseString())); // Exception Handling fehlt
      int fehler = valKredit.analyse(kg, KreditgeberCheck2.class);
      if (fehler == 0) {
        ok = true;
      }
    }
    kreditaufnahmePruefen(k, kg);
  }

  public void kreditaufnahmePruefen(Kunde k, Kreditgeber kg) {
    k.kreditHinzu(kg);
    int fehler = valKunde.analyse(k, KundeCheck3.class);
    if (fehler > 0) {
      k.loescheLetzten();
      System.out.println("Kreditvergabe abgelehnt");
    }
  }

  private void uebersicht() {
    for (Kunde k : kunden) {
      System.out.print(k);
    }
  }

  public static void main(String[] args) {
    new Main().dialog();
  }
}
