
package de.ivu.elect.business.personenpruefung.control;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.person.entity.Kontoverbindung;
import de.ivu.elect.business.person.entity.Personendaten;

public abstract class AbstractPersonenPruefungAttributeChangedChecker<E extends Personendaten> {

  private boolean personenregisterAbgleichAttributeChanged;

  private boolean dublettenAttributeChanged;

  private boolean mehrstaatigkeitAttributeChanged;

  private boolean wahlrechtAttributeChanged;

  private boolean kontodatenaenderungBearbeiterBestaetigungErforderlichAttributeChanged;

  private boolean kontoverbindungMehrfachAngegebenAttributeChanged;

  protected AbstractPersonenPruefungAttributeChangedChecker() {
    super();
  }

  public void bestimmeAttributeChanged(E personendaten) {
    personenregisterAbgleichAttributeChanged = bestimmePersonenregisterAbgleichAttributeChanged(personendaten);
    dublettenAttributeChanged = bestimmeDublettenAttributeChanged(personendaten);
    mehrstaatigkeitAttributeChanged = bestimmeMehrstaatigkeitAttributeChanged(personendaten);
    wahlrechtAttributeChanged = bestimmeWahlrechtAttributeChanged(personendaten);
    kontodatenaenderungBearbeiterBestaetigungErforderlichAttributeChanged = bestimmeKontodatenaenderungBearbeiterBestaetigungErforderlichAttributeChanged(personendaten);
    kontoverbindungMehrfachAngegebenAttributeChanged = bestimmeKontoverbindungMehrfachAngegebenAttributeChanged(personendaten);
  }

  public boolean isPersonenregisterAbgleichAttributeChanged() {
    return personenregisterAbgleichAttributeChanged;
  }

  protected boolean bestimmePersonenregisterAbgleichAttributeChanged(E personendaten) {
    return personendaten.hasChangedExternesOrdnungsmerkmal();
  }

  public boolean isDublettenAttributeChanged() {
    return dublettenAttributeChanged;
  }

  protected boolean bestimmeDublettenAttributeChanged(E personendaten) {
    // Cf. alle Implementierungen von PersonenVergleichFunktion...
    return personendaten.hasChangedFamilienname() || personendaten.hasChangedRufname() || personendaten.hasChangedGeburtsdatum() || personendaten.hasChangedGeschlecht()
        || personendaten.hasChangedExternesOrdnungsmerkmal();
  }

  public boolean isMehrstaatigkeitAttributeChanged() {
    return mehrstaatigkeitAttributeChanged;
  }

  protected boolean bestimmeMehrstaatigkeitAttributeChanged(E personendaten) {
    return personendaten.hasChangedStaatsangehoerigkeiten();
  }

  public boolean isWahlrechtAttributeChanged() {
    return wahlrechtAttributeChanged;
  }

  protected boolean bestimmeWahlrechtAttributeChanged(E personendaten) {
    return hasWahlrechtPersonendatenAttributeChanged(personendaten) || hasWahlrechtAnschriftAttributeChanged(personendaten.getAnschrift());
  }

  protected boolean hasWahlrechtPersonendatenAttributeChanged(E personendaten) {
    return personendaten.hasChangedGeburtsdatum() || personendaten.hasChangedStaatsangehoerigkeiten() || personendaten.hasChangedWahlrechtsausschluss() || personendaten.hasChangedAuswaertig()
        || personendaten.hasChangedZuzugsdatumBund() || personendaten.hasChangedZuzugsdatumLand() || personendaten.hasChangedZuzugsdatumGemeinde() || personendaten.hasChangedZuzugsdatumStadtbezirk();
  }

  protected boolean hasWahlrechtAnschriftAttributeChanged(Anschrift anschrift) {
    return anschrift.hasChangedAnschriftArt();
  }

  public boolean isKontodatenaenderungBearbeiterBestaetigungErforderlichAttributeChanged() {
    return kontodatenaenderungBearbeiterBestaetigungErforderlichAttributeChanged;
  }

  protected boolean bestimmeKontodatenaenderungBearbeiterBestaetigungErforderlichAttributeChanged(E personendaten) {
    Kontoverbindung kontoverbindung = personendaten.getKontoverbindung();

    return kontoverbindung.hasChangedBankleitzahl() //
        || kontoverbindung.hasChangedBic() //
        || kontoverbindung.hasChangedIban() //
        || kontoverbindung.hasChangedKontoinhaber() //
        || kontoverbindung.hasChangedKontonummer() //
        || kontoverbindung.hasChangedKreditinstitut();
  }

  public boolean isKontoverbindungMehrfachAngegebenAttributeChanged() {
    return kontoverbindungMehrfachAngegebenAttributeChanged;
  }

  protected boolean bestimmeKontoverbindungMehrfachAngegebenAttributeChanged(E personendaten) {
    return personendaten.getKontoverbindung().hasChangedIban();
  }
}
