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

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.anschrift.entity.AnschriftArt;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenregister.entity.PersonenregisterAnschrift;
import de.ivu.elect.business.personenregister.entity.PersonenregisterPersonendaten;

public class PersonendatenAnschriftPersonenregisterAnschriftMapper implements PersonenregisterAnschriftMapper {

  private static final long serialVersionUID = 1L;

  public PersonendatenAnschriftPersonenregisterAnschriftMapper() {
    super();
  }

  @Override
  public void mapAutomatischerAbgleich(Personendaten personendaten, PersonenregisterPersonendaten template) {
    mapDefaults(personendaten, template);
  }

  @Override
  public void mapManuelleAuswahl(Personendaten personendaten, PersonenregisterPersonendaten template) {
    mapDefaults(personendaten, template);
  }

  private void mapDefaults(Personendaten personendaten, PersonenregisterPersonendaten template) {
    Anschrift anschrift = personendaten.getAnschrift();

    mapDefaults(anschrift, getPersonenregisterAnschriftOrDefault(anschrift, template));
  }

  protected void mapDefaults(Anschrift anschrift, PersonenregisterAnschrift template) {
    anschrift.setAnschriftArt(template.getAnschriftArt());

    anschrift.setStrasse(template.getStrasse());
    anschrift.setHausnummer(template.getHausnummer());
    anschrift.setHausnummerzusatz(template.getHausnummerzusatz());

    // NOTE, dass der Matcher die Übernehmbarkeit positiv entscheidet, falls einer der Werte NICHT gesetzt ist. Deshalb
    // muss an dieser Stelle überprüft werden, ob denn tatsächlich eine Wohnungsnummer im Personenregister vorhanden ist!
    if (isNotBlank(template.getWohnungsnummer())) {
      anschrift.setWohnungsnummer(template.getWohnungsnummer());
    }

    anschrift.setPlz(template.getPlz());
    anschrift.setOrt(template.getOrt());

    // NOTE, dass der Matcher die Übernehmbarkeit positiv entscheidet, falls einer der Werte NICHT gesetzt ist. Deshalb
    // muss an dieser Stelle überprüft werden, ob denn tatsächlich ein Ortsteil im Personenregister vorhanden ist!
    if (isNotBlank(template.getOrtsteil())) {
      anschrift.setOrtsteil(template.getOrtsteil());
    }

    anschrift.setZustellanweisung(template.getZustellanweisung());
  }

  protected PersonenregisterAnschrift getPersonenregisterAnschriftOrDefault(Anschrift anschrift, PersonenregisterPersonendaten template) {
    AnschriftArt anschriftArt = anschrift.getAnschriftArt();

    if (template.hasAnschrift(anschriftArt)) {
      return template.getAnschrift(anschriftArt);
    }

    if (AnschriftArt.UNBEKANNT.equals(anschriftArt) && template.hasAnschrift(AnschriftArt.HAUPTWOHNUNG)) {
      return template.getAnschrift(AnschriftArt.HAUPTWOHNUNG);
    }

    return template.getAnschriften().stream().findFirst().orElse(new PersonenregisterAnschrift(anschriftArt));
  }
}
