
package de.ivu.elect.presentation.personenpruefung;

import static java.util.Collections.emptyList;
import static org.apache.commons.lang3.StringUtils.isAnyBlank;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.person.entity.PersonStatus;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonenregisterAbgleichStatus;
import de.ivu.elect.business.personenpruefung.control.InstantPersonenPruefer;
import de.ivu.elect.business.personenpruefung.control.PersonenPruefSchritt;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.AjaxHelper;

// Cf. /elect-common-war/src/main/webapp/WEB-INF/templates/personenpruefung/instant-personen-pruefer-dialog.xhtml.
public class InstantPersonenPrueferViewHelper implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient AjaxHelper ajaxHelper;

  @Inject
  private transient Messages messages;

  @Inject
  private transient InstantPersonenPruefer personenPruefer;

  @Inject
  private transient PersonenPruefSchrittFormatter personenPruefSchrittFormatter;

  public InstantPersonenPrueferViewHelper() {
    super();
  }

  public boolean isDlgMarkAsUngueltigPersonendatenNichtVollstaendigRequired(Personendaten personendaten) {
    return !personendaten.isPersonStatusNichtGeeignet() && (isAnyBlank(personendaten.getFamilienname(), personendaten.getRufname()) || !personendaten.hasGeburtsdatum());
  }

  public String showDlgMarkAsUngueltigPersonendatenNichtVollstaendig() {
    return openConfirmDialog("MarkAsUngueltigPersonendatenNichtVollstaendig");
  }

  public void markAsUngueltigPersonendatenNichtVollstaendig(Personendaten personendaten) {
    String personStatusNichtGeeignetBegruendung = getMessage("instant.personen.pruefer.action.mark.as.ungueltig.personendaten.nicht.vollstaendig.bemerkung.begruendung");

    markAsUngueltig(personendaten, personStatusNichtGeeignetBegruendung);
  }

  public boolean isDlgMarkAsUngueltigPersonendatenNichtAuswertbarRequired(Personendaten personendaten) {
    return !personendaten.isPersonStatusNichtGeeignet() && !personendaten.hasOrdnungsmerkmal();
  }

  public String showDlgMarkAsUngueltigPersonendatenNichtAuswertbar() {
    return openConfirmDialog("MarkAsUngueltigPersonendatenNichtAuswertbar");
  }

  public void markAsUngueltigPersonendatenNichtAuswertbar(Personendaten personendaten) {
    String personStatusNichtGeeignetBegruendung = getMessage("instant.personen.pruefer.action.mark.as.ungueltig.personendaten.nicht.auswertbar.bemerkung.begruendung");

    markAsUngueltig(personendaten, personStatusNichtGeeignetBegruendung);
  }

  public boolean isDlgMarkAsUngueltigPersonendatenManuellZuPruefenRequired(Personendaten personendaten) {
    return !personendaten.isPersonStatusNichtGeeignet() && !collectPersonenPruefSchritteFailed(personendaten).isEmpty();
  }

  public String showDlgMarkAsUngueltigPersonendatenManuellZuPruefen() {
    return openConfirmDialog("MarkAsUngueltigPersonendatenManuellZuPruefen");
  }

  public void markAsUngueltigPersonendatenManuellZuPruefen(Personendaten personendaten) {
    String personStatusNichtGeeignetBegruendung = collectPersonenPruefSchritteFailedFormatted(personendaten).stream().map(PersonenPruefSchrittFormatted::toString).collect(Collectors.joining(", "));

    markAsUngueltig(personendaten, personStatusNichtGeeignetBegruendung);
  }

  public void markAsUngeprueft(Personendaten personendaten) {
    updatePersonendatenStatus(personendaten, PersonStatus.UNGEPRUEFT, PersonenregisterAbgleichStatus.ABGLEICH_NOTWENDIG, "");
  }

  private void markAsUngueltig(Personendaten personendaten, String personStatusNichtGeeignetBegruendung) {
    updatePersonendatenStatus(personendaten, PersonStatus.NICHT_GEEIGNET, PersonenregisterAbgleichStatus.ABGLEICH_DURCHGEFUEHRT,
        getMessage("instant.personen.pruefer.action.mark.as.ungueltig.personendaten.bemerkung", personStatusNichtGeeignetBegruendung));
  }

  private void updatePersonendatenStatus(Personendaten personendaten, PersonStatus personStatus, PersonenregisterAbgleichStatus personenregisterAbgleichStatus, String personStatusBemerkung) {
    personendaten.setPersonStatus(personStatus);
    personendaten.setBemerkung(personStatusBemerkung);
    personendaten.setPersonenregisterAbgleichStatus(personenregisterAbgleichStatus);
    personendaten.setPersonenregisterAbgleichZeitpunkt(null);

    if (PersonenregisterAbgleichStatus.ABGLEICH_DURCHGEFUEHRT.equals(personenregisterAbgleichStatus)) {
      personendaten.setPersonenregisterAbgleichZeitpunkt(new Date());
    }
  }

  public List<PersonenPruefSchrittFormatted> collectPersonenPruefSchritteFailedFormatted(Personendaten personendaten) {
    return personenPruefSchrittFormatter.formatPersonenPruefSchritteFailed(personendaten, collectPersonenPruefSchritteFailed(personendaten));
  }

  private List<PersonenPruefSchritt> collectPersonenPruefSchritteFailed(Personendaten personendaten) {
    if (!personendaten.isPersonStatusNichtGeeignet()) {
      return personenPruefer.getPersonenPruefSchritteFailed(personendaten);
    }

    return emptyList();
  }

  private String openConfirmDialog(String dialogName) {
    ajaxHelper.openPageDialog(dialogName);

    return null;
  }

  private String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  private Messages getMessages() {
    return messages;
  }
}
