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

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

import de.ivu.elect.business.gruppe.entity.EntityMitGruppe;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppeConstants;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;
import de.ivu.elect.business.wahlvorschlag.entity.EntityMitWahlvorschlag;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

public class TeilnahmePolitischeGruppeColumn extends AbstractTeilnahmeColumn<Teilnahme> {

  private static final long serialVersionUID = 1L;

  protected TeilnahmePolitischeGruppeColumn(Messages messages) {
    super(messages, null, null, null);
  }

  @Override
  public Object getValue(Teilnahme teilnahme) {
    if (hasPersonendatenMitPolitischerGruppe(teilnahme)) {
      return getValue(castTo(teilnahme.getPersonendaten(), EntityMitGruppe.class));
    }

    if (hasPersonendatenMitWahlvorschlag(teilnahme)) {
      return getValue(castTo(teilnahme.getPersonendaten(), EntityMitWahlvorschlag.class));
    }

    return "";
  }

  private Object getValue(EntityMitGruppe entity) {
    if (entity.hasGruppe()) {
      return getValue(entity.getGruppe());
    }

    return "";
  }

  private Object getValue(EntityMitWahlvorschlag entity) {
    if (entity.hasWahlvorschlag()) {
      return getValue(entity.getWahlvorschlag().getGruppe());
    }

    return "";
  }

  private String getValue(Gruppe gruppe) {
    if (gruppe != null) {
      return gruppe.getKurzname();
    }

    return "";
  }

  @Override
  public String getHeader() {
    return getMessage(PolitischeGruppeConstants.MESSAGE_KEY_ENTITY_EINZAHL);
  }

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

  private boolean hasPersonendatenMitPolitischerGruppe(Teilnahme teilnahme) {
    return hasPersonendatenMitInstanceOf(teilnahme, EntityMitGruppe.class);
  }

  private boolean hasPersonendatenMitWahlvorschlag(Teilnahme teilnahme) {
    return hasPersonendatenMitInstanceOf(teilnahme, EntityMitWahlvorschlag.class);
  }

  private boolean hasPersonendatenMitInstanceOf(Teilnahme teilnahme, Class< ? > clazz) {
    return teilnahme != null && teilnahme.getPersonendaten().isInstanceOf(clazz);
  }
}
