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

import java.util.Collections;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.control.GebietByBreadthFirstComparator;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.gebietsbaum.AnzahlWahlberechtigteErfassungState;


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

public class AnzahlWahlberechtigteViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient AnzahlWahlberechtigteErfassungState anzahlWahlberechtigteErfassungState;

  @Inject
  private transient WasGebietViewFormBuilder gebietViewFormBuilder;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  public AnzahlWahlberechtigteViewFormBuilder() {
    super();
  }

  public boolean isErfassungMoeglich(Gebiet gebiet) {
    return anzahlWahlberechtigteErfassungState.isErfassungMoeglich(gebiet);
  }

  public boolean isErfassungGesperrt(Gebiet gebiet) {
    return anzahlWahlberechtigteErfassungState.isErfassungGesperrt(gebiet);
  }

  public boolean isErfassungGesperrtLautGebietsart(Gebiet gebiet) {
    return anzahlWahlberechtigteErfassungState.isErfassungGesperrtLautGebietsart(gebiet);
  }

  public boolean isErfassungGesperrtByErgebniseingang(Gebiet gebiet) {
    return anzahlWahlberechtigteErfassungState.isErfassungGesperrtByErgebniseingang(gebiet);
  }

  public void addProperties(FormBuilder formBuilder, Gebiet gebiet) {
    addProperties(formBuilder, gebiet, false);
  }

  public void addProperties(FormBuilder formBuilder, Gebiet gebiet, boolean readonly) {
    gebietViewFormBuilder.addBasicGebietProperties(formBuilder, gebiet, true);

    if (gebiet.isInstanceOf(Wahldurchfuehrungsgebiet.class)) {
      addAnzahlWahlberechtigtePropertiesMitErfasstIn(formBuilder, castTo(gebiet, Wahldurchfuehrungsgebiet.class), readonly);
    }
  }

  public void addAnzahlWahlberechtigtePropertiesMitErfasstIn(FormBuilder formBuilder, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, boolean readonly) {
    gebietViewFormBuilder.addAnzahlWahlberechtigteProperties(formBuilder, wahldurchfuehrungsgebiet, readonly,
        ()->wahldurchfuehrungsgebietExtendedDAO.findByErfasstFuerGebiete(wahldurchfuehrungsgebiet).stream().sorted(GebietByBreadthFirstComparator.INSTANCE).collect(
            Collectors.toList()));
  }

  public void addAnzahlWahlberechtigteProperties(FormBuilder formBuilder, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, boolean readonly) {
    gebietViewFormBuilder.addAnzahlWahlberechtigteProperties(formBuilder, wahldurchfuehrungsgebiet, readonly, Collections::emptyList);
  }
}
