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

import static org.apache.commons.lang3.StringUtils.containsIgnoreCase;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;

import javax.inject.Inject;

import de.ivu.elect.business.anschrift.control.AnschriftKopieren;
import de.ivu.elect.business.person.entity.PersonStatus;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonenregisterAbgleichStatus;

public class PersonendatenKopieren implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient AnschriftKopieren anschriftKopieren;

  @Inject
  private transient KontoverbindungKopieren kontoverbindungKopieren;

  public PersonendatenKopieren() {
    super();
  }

  public void kopierePersonendaten(Personendaten source, Personendaten target, PersonendatenKopierenParameter personendatenKopierenParameter) {
    /*
     * Attribute zum späteren Zurücksetzen sichern....
     */
    PersonStatus personStatus = target.getPersonStatus();

    PersonenregisterAbgleichStatus personenregisterAbgleichStatus = target.getPersonenregisterAbgleichStatus();
    Date personenregisterAbgleichZeitpunkt = target.getPersonenregisterAbgleichZeitpunkt();

    String bemerkung = target.getBemerkung(); // ELECTDD-576

    if (personendatenKopierenParameter.isNurGeaenderteWerteKopieren()) {
      source.copyChangedEntityAttributesUsingSetter(target);
      target.setCustomDataXml(source.getCustomDataXml());
    } else {
      source.copyEntityAttributesUsingSetter(target);
      target.setCustomDataXml(source.getCustomDataXml());
    }

    anschriftKopieren.kopiereAnschrift(source.getAnschrift(), target.getAnschrift(), personendatenKopierenParameter.isNurGeaenderteWerteKopieren());

    kontoverbindungKopieren.kopiereKontoverbindung(source.getKontoverbindung(), target.getKontoverbindung(), personendatenKopierenParameter.isNurGeaenderteWerteKopieren());

    kopierePersonendatenTags(source, target, personendatenKopierenParameter);

    if (!personendatenKopierenParameter.isNurGeaenderteWerteKopieren() || source.hasChangedStaats()) {
      target.setStaatsangehoerigkeitenSorted(source.getStaatsangehoerigkeitenSorted());
    }

    /*
     * Attribute zurücksetzen...
     */
    aktualisierePersonStatus(target, personendatenKopierenParameter, personStatus, personenregisterAbgleichStatus, personenregisterAbgleichZeitpunkt);
    aktualisierePersonBemerkung(target, personendatenKopierenParameter, bemerkung);
  }

  protected void kopierePersonendatenTags(Personendaten source, Personendaten target, PersonendatenKopierenParameter personendatenKopierenParameter) {
    if (personendatenKopierenParameter.isPersonendatenTagsErgaenzen()) {
      kopierePersonendatenTags(target, source.getPersonendatenTag());
    }
  }

  public void kopierePersonendatenTags(Personendaten target, Collection<String> personendatenTags) {
    new HashSet<>(personendatenTags).forEach(target::addPersonendatenTag);
  }

  public void aktualisierePersonStatus(Personendaten target, PersonendatenKopierenParameter personendatenKopierenParameter, PersonStatus personStatus,
      PersonenregisterAbgleichStatus personenregisterAbgleichStatus, Date personenregisterAbgleichZeitpunkt) {
    if (personendatenKopierenParameter.isPersonStatusKopieren()) { // ELECT-14331
      if (personendatenKopierenParameter.isPersonStatusZuruecksetzen()) {
        if (personStatus == null || !personStatus.isNichtZuPruefen()) {
          target.setPersonStatus(PersonStatus.UNGEPRUEFT);
        }

        if (personenregisterAbgleichStatus == null || personenregisterAbgleichStatus.isAbgleichMoeglich()) {
          target.setPersonenregisterAbgleichStatus(PersonenregisterAbgleichStatus.ABGLEICH_NOTWENDIG);
          target.setPersonenregisterAbgleichZeitpunkt(null);
        }
      }
    } else {
      if (personendatenKopierenParameter.isPersonStatusZuruecksetzen()) {
        if (personStatus == null || !personStatus.isNichtZuPruefen()) {
          target.setPersonStatus(PersonStatus.UNGEPRUEFT);
        } else {
          target.setPersonStatus(personStatus);
        }

        if (personenregisterAbgleichStatus == null || personenregisterAbgleichStatus.isAbgleichMoeglich()) {
          target.setPersonenregisterAbgleichStatus(PersonenregisterAbgleichStatus.ABGLEICH_NOTWENDIG);
          target.setPersonenregisterAbgleichZeitpunkt(null);
        } else {
          target.setPersonenregisterAbgleichStatus(personenregisterAbgleichStatus);
          target.setPersonenregisterAbgleichZeitpunkt(personenregisterAbgleichZeitpunkt);
        }
      } else {
        target.setPersonStatus(personStatus);

        target.setPersonenregisterAbgleichStatus(personenregisterAbgleichStatus);
        target.setPersonenregisterAbgleichZeitpunkt(personenregisterAbgleichZeitpunkt);
      }
    }
  }

  public void aktualisierePersonBemerkung(Personendaten target, PersonendatenKopierenParameter personendatenKopierenParameter, String bemerkung) {
    String bemerkungKopiert = trimToEmpty(target.getBemerkung());

    if (/* ELECTDD-684 */ isBlank(bemerkungKopiert) || !personendatenKopierenParameter.isBemerkungKopieren()) {
      target.setBemerkung(bemerkung);
    } else {
      String bemerkungJoined = trimToEmpty(bemerkung);

      if (!containsIgnoreCase(bemerkungJoined, bemerkungKopiert)) {
        if (isNotBlank(bemerkungJoined)) {
          bemerkungJoined += ", ";
        }

        bemerkungJoined += bemerkungKopiert;
      }

      target.setBemerkung(bemerkungJoined);
    }
  }
}
