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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
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.table.AbstractColumnEntry;
import de.ivu.elect.presentation.wahlvorschlag.table.WahlvorschlagStimmzettelPositionColumn;

public class GruppeImGebietStimmzettelPositionColumn extends AbstractColumnEntry<GruppeImGebiet> {

  private static final long serialVersionUID = 1L;

  private final EntityAufStimmzettelDaten entityAufStimmzettelDaten;

  private final WahlvorschlagStimmzettelPositionColumn<Wahlvorschlag> wahlvorschlagStimmzettelPositionColumn;

  public GruppeImGebietStimmzettelPositionColumn(Messages messages, Icons icons, Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super(messages);

    this.entityAufStimmzettelDaten = entityAufStimmzettelDaten;

    this.wahlvorschlagStimmzettelPositionColumn = new WahlvorschlagStimmzettelPositionColumn<>(messages, icons, gebiet, entityAufStimmzettelDaten);
  }

  @Override
  public ColumnType getType() {
    return wahlvorschlagStimmzettelPositionColumn.getType();
  }

  @Override
  public String getHeader() {
    return wahlvorschlagStimmzettelPositionColumn.getHeader();
  }

  @Override
  public Object getValue(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return null;
    }

    return wahlvorschlagStimmzettelPositionColumn.getDisplayValue(wahlvorschlag);
  }

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

  @Override
  public boolean isIconRendered(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return false;
    }

    return wahlvorschlagStimmzettelPositionColumn.isIconRendered(wahlvorschlag);
  }

  @Override
  public String getIcon(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return super.getIcon(gruppeImGebiet);
    }

    return wahlvorschlagStimmzettelPositionColumn.getIcon(wahlvorschlag);
  }

  @Override
  public String getIconTitle(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return super.getIconTitle(gruppeImGebiet);
    }

    return wahlvorschlagStimmzettelPositionColumn.getIconTitle(wahlvorschlag);
  }

  @Override
  public String getIconStyleClass(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return super.getIconStyleClass(gruppeImGebiet);
    }

    return wahlvorschlagStimmzettelPositionColumn.getIconStyleClass(wahlvorschlag);
  }

  @Override
  public String getIconStyle(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return super.getIconStyle(gruppeImGebiet);
    }

    return wahlvorschlagStimmzettelPositionColumn.getIconStyle(wahlvorschlag);
  }

  @Override
  public String getTooltip(GruppeImGebiet gruppeImGebiet) {
    Wahlvorschlag wahlvorschlag = getZugehoerigenWahlvorschlag(gruppeImGebiet);

    if (wahlvorschlag == null) {
      return super.getIcon(gruppeImGebiet);
    }

    return wahlvorschlagStimmzettelPositionColumn.getTooltip(wahlvorschlag);
  }

  private Wahlvorschlag getZugehoerigenWahlvorschlag(GruppeImGebiet gruppeImGebiet) {
    return gruppeImGebiet.getZugehoerigenWahlvorschlag(() -> entityAufStimmzettelDaten.collectWahlvorschlaegeInWahl(gruppeImGebiet.getWahl()));
  }
}
