
package de.ivu.elect.presentation.kandidatur.table;

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

import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.function.BiFunction;

import de.ivu.elect.business.person.entity.NlPersonendaten;
import de.ivu.elect.business.person.entity.NlPersonendatenProperties;
import de.ivu.elect.business.person.entity.PersonStatus;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenConstants;
import de.ivu.elect.business.personenpruefung.boundary.AbstractPersonenKonfliktDAO;
import de.ivu.elect.business.personenpruefung.entity.NlKandidaturKonfliktPersonenregisterAbgleich;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonflikt;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktArt;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.person.table.AbstractPersonendatenColumn;
import de.ivu.elect.presentation.person.table.PersonendatenPersonStatusMitIconColumn;

// ELECT-11565
public class NlKandidaturPersonStatusColumn<E extends Personendaten> extends AbstractPersonendatenColumn<E> {

  private static final long serialVersionUID = 1L;

  private BiFunction<E, Collection<PersonenKonfliktArt>, List<PersonenKonflikt>> personenKonflikteFct;

  private final Icons icons;

  private final PersonendatenPersonStatusMitIconColumn<E> personendatenPersonStatusMitIconColumn;

  public NlKandidaturPersonStatusColumn(AbstractPersonenKonfliktDAO personenKonfliktDAO, Messages messages, Icons icons) {
    this(personenKonfliktDAO::findByPersonAndKonfliktArt, messages, icons);
  }

  public NlKandidaturPersonStatusColumn(BiFunction<E, Collection<PersonenKonfliktArt>, List<PersonenKonflikt>> personenKonflikteFct, Messages messages, Icons icons) {
    super("Nl-Kandidatur-Person-Status-Column", messages, PersonendatenConstants.MESSAGE_KEY_PERSON_STATUS_EINZAHL, ColumnType.STRING, kandidatur -> "");

    this.personenKonflikteFct = personenKonflikteFct;

    this.icons = icons;

    this.personendatenPersonStatusMitIconColumn = new PersonendatenPersonStatusMitIconColumn<>(messages, icons);
  }

  // ELECT-13412
  public static boolean isRendered(Wahl wahl) {
    return NlKandidaturKonfliktPersonenregisterAbgleich.isUnterstuetzt(wahl);
  }

  @Override
  public Object getValue(E kandidatur) {
    String result = "";

    PersonStatus personStatus = getPersonStatus(kandidatur);

    if (personStatus != null) {
      result = getMessage(personStatus);

      if (isRendered(kandidatur.getWahl()) && isNotBlank(result) && personStatus.isGeeignet()) {
        String msgKeySuffix = "automatisch";

        if (isPersonenregisterAbgleichStatusManuellGeprueft(kandidatur)) {
          msgKeySuffix = "manuell";
        }

        result = getMessage("PersonStatus.format.personenregister.abgleich.status." + msgKeySuffix, result);
      }
    } else {
      Object value = personendatenPersonStatusMitIconColumn.getValue(kandidatur);

      if (value != null) {
        result = value.toString();
      }
    }

    return result;
  }

  private boolean isPersonenregisterAbgleichStatusManuellGeprueft(E kandidatur) {
    return !personenKonflikteFct.apply(kandidatur, EnumSet.of(PersonenKonfliktArt.ABGLEICH_FEHLGESCHLAGEN)).isEmpty();
  }

  @Override
  public boolean isIconPresent() {
    return personendatenPersonStatusMitIconColumn.isIconPresent();
  }

  @Override
  public boolean isIconRendered(E kandidatur) {
    return getPersonStatus(kandidatur) != null || personendatenPersonStatusMitIconColumn.isIconRendered(kandidatur);
  }

  @Override
  public String getIcon(E kandidatur) {
    PersonStatus personStatus = getPersonStatus(kandidatur);

    if (personStatus != null) {
      return personStatus.getIcon(icons);
    }

    return personendatenPersonStatusMitIconColumn.getIcon(kandidatur);
  }

  @Override
  public String getIconStyle(E kandidatur) {
    return personendatenPersonStatusMitIconColumn.getIconStyle(kandidatur);
  }

  @Override
  public String getIconStyleClass(E kandidatur) {
    return personendatenPersonStatusMitIconColumn.getIconStyleClass(kandidatur);
  }

  @Override
  public String getIconTitle(E kandidatur) {
    return personendatenPersonStatusMitIconColumn.getIconTitle(kandidatur);
  }

  @Override
  public String getTooltip(E kandidatur) {
    if (kandidatur != null) {
      return new NlPersonendatenProperties(kandidatur).getPersonStatusProperty().getTooltip();
    }

    return super.getTooltip(kandidatur);
  }

  private PersonStatus getPersonStatus(E kandidatur) {
    if (kandidatur == null) {
      return null;
    }

    return new NlPersonendaten(kandidatur).getPersonStatus();
  }
}
