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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

import java.util.function.Function;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

public class AnzahlWahlberechtigteColumn extends AbstractGebietColumn<Gebiet> {

  private static final long serialVersionUID = 1L;

  private final String header;

  public AnzahlWahlberechtigteColumn(AbstractWahldurchfuehrungsgebietColumn<Wahldurchfuehrungsgebiet> column, String header) {
    this(column.getId(), column.getMessages(), header, gebiet -> {
      if (isWahldurchfuehrungsgebietHavingAnyAnzahlWahlberechtigte(gebiet)) {
        return column.getValue(castTo(gebiet, Wahldurchfuehrungsgebiet.class));
      }

      return null;
    });
  }

  public AnzahlWahlberechtigteColumn(String id, Messages messages, String header, Function<Wahldurchfuehrungsgebiet, Object> valueFct) {
    super(id, messages, "", ColumnType.LONG, gebiet -> {
      if (isWahldurchfuehrungsgebietHavingAnyAnzahlWahlberechtigte(gebiet)) {
        return valueFct.apply(castTo(gebiet, Wahldurchfuehrungsgebiet.class));
      }

      return null;
    });

    this.header = header;
  }

  @Override
  public String getHeader() {
    return header;
  }

  private static boolean isWahldurchfuehrungsgebietHavingAnyAnzahlWahlberechtigte(Gebiet gebiet) {
    if (gebiet != null && gebiet.isInstanceOf(Wahldurchfuehrungsgebiet.class)) {
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = castTo(gebiet, Wahldurchfuehrungsgebiet.class);

      return !wahldurchfuehrungsgebiet.isBriefwahlgebiet() || wahldurchfuehrungsgebiet.getAnzahlWahlberechtigterGesamtA1A2A3NotNull() > 0;
    }

    return false;
  }
}
