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

import static java.util.Objects.isNull;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nullable;
import javax.faces.convert.Converter;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.GruppeConstants;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietConstants;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.faces.EntityConverter;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectOneMenuProperty;
import de.ivu.elect.presentation.wahlvorschlag.WahlvorschlagGruppeFinder;

public class WahlvorschlagGruppeFinderSelectOneMenuProperty extends AbstractSelectOneMenuProperty<Gruppe> implements WahlvorschlagGruppeFinderProperty {

  private final WahlvorschlagGruppeFinder wahlvorschlagGruppeFinder;

  private final Wahlvorschlag wahlvorschlag;

  public WahlvorschlagGruppeFinderSelectOneMenuProperty(WahlvorschlagGruppeFinder wahlvorschlagGruppeFinder, Wahlvorschlag wahlvorschlag) {
    super();

    this.wahlvorschlagGruppeFinder = wahlvorschlagGruppeFinder;
    this.wahlvorschlag = wahlvorschlag;
  }

  @Override
  public Converter getDefaultConverter() {
    return EntityConverter.getInstance();
  }

  @Override
  public Gruppe getGruppe() {
    return wahlvorschlag.getGruppe();
  }

  @Override
  public Gebiet getGebiet() {
    return wahlvorschlag.getGebiet();
  }

  @Override
  public boolean hasNoSelectionItem() {
    // Cf. ELECT-649
    return true;
  }

  @Override
  public boolean getDefaultRequired() {
    return !GruppeImGebietConstants.GRUPPE_ID_NULLABLE;
  }

  @Override
  public String getDefaultLabel() {
    return getMessage(getDefaultLabelMsgKey());
  }

  @Override
  public String getDefaultLabelMsgKey() {
    return GruppeConstants.MESSAGE_KEY_ENTITY_EINZAHL;
  }

  @Override
  public Gruppe getValue() {
    return getGruppe();
  }

  @Override
  public void setValue(Gruppe gruppe) {
    wahlvorschlag.getGruppeImGebiet().setGruppe(attach(gruppe));
  }

  private PolitischeGruppe attach(Gruppe gruppe) {
    return wahlvorschlagGruppeFinder.findByPrimaryKey(gruppe.getPk());
  }

  @Override
  public List<Gruppe> getValues() {
    return new ArrayList<>(wahlvorschlagGruppeFinder.findSupportedPolitischeGruppen(getGebiet(), wahlvorschlag));
  }

  @Override
  public String getItemLabel(@Nullable Gruppe gruppe) {
    if (isNull(gruppe)) {
      return "";
    }

    return attach(gruppe).getKurznameAufGebiet(getGebiet());
  }
}
