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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;
import static org.apache.commons.lang3.StringUtils.isNoneBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.util.Optional;

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.NlPolitischeGruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.status.AbstractStatusEntryFactory;

public class NlGruppeNameKennwortAbgelehntColumn extends AbstractGruppeColumn<Gruppe> {

  private static final long serialVersionUID = 1L;

  /**
   * @deprecated ELECT-14496
   */
  @Deprecated
  protected static final String TOOLTIP_LINE_SEPARATOR = AbstractStatusEntryFactory.TOOLTIP_LINE_SEPARATOR;

  public NlGruppeNameKennwortAbgelehntColumn(Messages messages) {
    super("Gruppe-NameKennwort-Abgelehnt", messages, "gruppe.search.name.abgelehnt.column.header", ColumnType.BOOLEAN, gruppe -> {
      if (isNameAbgelehnt(gruppe)) {
        return true;
      }

      return null;
    });
  }

  @Override
  public String getTooltip(Gruppe gruppe) {
    return asNlPolitischeGruppe(gruppe).filter(NlPolitischeGruppe::isNameAbgelehnt).map(nlPolitischeGruppe -> {
      String nameAbgelehnt = trimToEmpty(nlPolitischeGruppe.getNameInitial());
      String nameAbgelehntBemerkung = trimToEmpty(nlPolitischeGruppe.getNameAbgelehntBemerkung());

      String result = nameAbgelehnt;

      if (isNoneBlank(nameAbgelehnt, nameAbgelehntBemerkung)) {
        result += TOOLTIP_LINE_SEPARATOR;
      }

      result += nameAbgelehntBemerkung;

      return result;
    }).orElse(super.getTooltip(gruppe));
  }

  private static boolean isNameAbgelehnt(Gruppe gruppe) {
    return asNlPolitischeGruppe(gruppe).map(NlPolitischeGruppe::isNameAbgelehnt).orElse(false);
  }

  private static Optional<NlPolitischeGruppe> asNlPolitischeGruppe(Gruppe gruppe) {
    if (gruppe != null && gruppe.isPolitischeGruppe()) {
      return Optional.of(new NlPolitischeGruppe(castTo(gruppe, PolitischeGruppe.class)));
    }

    return Optional.empty();
  }
}
