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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.staat.boundary.StaatExtendedDAO;
import de.ivu.elect.business.staat.boundary.StaatenGruppeTypFinder;
import de.ivu.elect.business.staat.entity.StaatenGruppe;
import de.ivu.elect.business.staat.entity.StaatenGruppeProperties;
import de.ivu.elect.business.staat.entity.StaatenGruppeStaatenPickListProperty;
import de.ivu.elect.business.staat.entity.StaatenGruppeTyp;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;

public class StaatenGruppeViewFormBuilder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private StaatExtendedDAO staatDao;

  @Inject
  private StaatenGruppeTypFinder staatenGruppeTypFinder;

  public StaatenGruppeViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, StaatenGruppe staatenGruppe) {
    addProperties(formBuilder, staatenGruppe, false);
  }

  public void addProperties(FormBuilder formBuilder, StaatenGruppe staatenGruppe, boolean readonly) {
    StaatenGruppeProperties staatenGruppeProperties = staatenGruppe.getProperties();

    formBuilder.addProperty(staatenGruppeProperties.getBezeichnungProperty())
        .withReadonly(readonly || isStaatenGruppeTypReadonly(staatenGruppe));
    formBuilder.addProperty(staatenGruppeProperties.getStaatenGruppeTypProperty()).setValues(getSupportedStaatenGruppeTypen())
        .withReadonly(readonly || isStaatenGruppeTypReadonly(staatenGruppe));

    formBuilder.addProperty(new StaatenGruppeStaatenPickListProperty(staatenGruppe, staatDao.findByAllOrderedByNameStaat()))
        .withReadonly(readonly);
  }

  private boolean isStaatenGruppeTypReadonly(StaatenGruppe staatenGruppe) {
    // NOTE, dass bspw. im WVZ eine Staatengruppe anhand ihrer Bezeichnung identifiziert wird und diese deshalb nicht
    // mehr bearbeitbar sein soll.
    return staatenGruppe.isPersistent()
        && StaatenGruppeTyp.WAHLRECHTSKRITERIUM_STAATSANGEHOERIGKEIT.equals(staatenGruppe.getStaatenGruppeTyp());
  }

  private List<StaatenGruppeTyp> getSupportedStaatenGruppeTypen() {
    return new ArrayList<>(staatenGruppeTypFinder.getSupportedStaatenGruppeTypen());
  }
}
