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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.control.ListeByPositionAufGebietComparator;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Listenverbindung;
import de.ivu.elect.business.wahlvorschlag.entity.ListenverbindungProperties;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.Property;

public class ListenverbindungViewFormBuilder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ListeExtendedDAO listeExtendedDAO;

  public ListenverbindungViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Listenverbindung listenverbindung, Gebiet gebiet) {
    ListenverbindungProperties listenverbindungProperties = listenverbindung.getProperties();

    formBuilder.addProperty(listenverbindungProperties.getBezeichnungProperty()).required();
    formBuilder.addProperty(createListenverbindungListeProperty(formBuilder, listenverbindung, gebiet));
  }

  private Property createListenverbindungListeProperty(FormBuilder formBuilder, Listenverbindung listenverbindung, Gebiet gebiet) {
    List<Liste> listenVerfuegbar = getVerfuegbareListen(listenverbindung, gebiet);

    Collection<GruppeImGebiet> gruppenImGebiet = new ArrayList<>();

    for (Liste liste : listenVerfuegbar) {
      gruppenImGebiet.add(liste.getGruppeImGebiet());
    }

    return new ListenverbindungListePickListProperty(listenverbindung, gebiet, listenVerfuegbar, new ListeByPositionAufGebietComparator(gebiet, gruppenImGebiet));
  }

  private List<Liste> getVerfuegbareListen(Listenverbindung listenverbindung, Gebiet gebiet) {
    List<Liste> result = listeExtendedDAO.findByGebiet(gebiet).stream().filter(liste -> liste.getListenverbindung() == null).collect(Collectors.toList());
    result.addAll(listenverbindung.getListen());

    return result;
  }
}
