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

import javax.annotation.Nullable;

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.entity.AbstractEagerLoading;
import de.ivu.elect.jee.entity.EagerLoading;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

// Cf. ListenkandidaturStimmzettelPositionColumn!
public class WahlvorschlagStimmzettelPositionColumn<E extends Wahlvorschlag> extends AbstractWahlvorschlagColumn<E> {

  private static final long serialVersionUID = 1L;

  private final Icons icons;

  public WahlvorschlagStimmzettelPositionColumn(Messages messages, Icons icons, Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super("Wahlvorschlag-Stimmzettel-Position", messages, "wahlvorschlag.position.stimmzettel", ColumnType.LONG, wahlvorschlag -> {
      if (wahlvorschlag != null) {
        return wahlvorschlag.getStimmzettelPosition(gebiet, entityAufStimmzettelDaten).getPosition();
      }

      return null;
    });

    this.icons = icons;
  }

  @Override
  public boolean isIconPresent() {
    return true;
  }

  @Override
  public boolean isIconRendered(E wahlvorschlag) {
    if (wahlvorschlag != null) {
      return hasStimmzettelPosition(wahlvorschlag) && wahlvorschlag.getGruppeImGebiet().getVorgegebenePosition() != null;
    }

    return super.isIconRendered(wahlvorschlag);
  }

  @Override
  public String getIcon(E wahlvorschlag) {
    if (isIconRendered(wahlvorschlag)) {
      return icons.getIconCheck();
    }

    return super.getIcon(wahlvorschlag);
  }

  @Override
  public String getTooltip(E wahlvorschlag) {
    if (isIconRendered(wahlvorschlag)) {
      return getMessage("wahlvorschlag.position.stimmzettel.vorgegeben.tooltip");
    }

    return super.getTooltip(wahlvorschlag);
  }

  @Nullable
  @Override
  public EagerLoading<E> getEagerLoading() {
    EagerLoading<E> defaultEagerLoading = super.getEagerLoading();

    return new AbstractEagerLoading<E>() {

      @Override
      public E eagerLoad(E wahlvorschlag) {
        if (defaultEagerLoading != null) {
          defaultEagerLoading.eagerLoad(wahlvorschlag);
        }

        GruppeImGebiet gruppeImGebiet = wahlvorschlag.getGruppeImGebiet();
        gruppeImGebiet.getGruppe().getName();
        gruppeImGebiet.getGebiet().getName();

        return wahlvorschlag;
      }
    };
  }

  private boolean hasStimmzettelPosition(E wahlvorschlag) {
    return getValue(wahlvorschlag) != null;
  }
}
