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

import static java.util.stream.Collectors.toSet;

import java.util.Collection;

import javax.inject.Inject;

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietConstants;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietProperties;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;
import de.ivu.elect.presentation.ViewFormBuilder;

public class CoreGruppeViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient GruppeViewFormBuilder gruppeViewFormBuilder;

  public CoreGruppeViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Gruppe gruppe, boolean readonly) {
    // NOTE ELECT-6208, ELECT-8610, dass die Namen nach einem Export aus WUS und anschließendem Import ins WAS immer an ALLE GruppeImGebiet
    // übernommen werden, cf. WasWahlImporter#persistiereGruppenImGebiet!
    boolean propertiesAufGebietenReadonly = !isGruppenBearbeitbar() && !collectGruppenImGebietMitNamen(gruppe).isEmpty();

    addProperties(formBuilder, gruppe, propertiesAufGebietenReadonly, readonly);
  }

  protected void addProperties(FormBuilder formBuilder, Gruppe gruppe, boolean propertiesAufGebietenReadonly, boolean globalReadonly) {
    gruppeViewFormBuilder.addProperties(formBuilder, gruppe, propertiesAufGebietenReadonly, globalReadonly);

    addGruppenImGebietMitNamenProperties(formBuilder, gruppe, propertiesAufGebietenReadonly, globalReadonly);
  }

  // NOTE ELECT-2065, dass die Anzeige nur im WUS bzw. in den KOM-Systemen sinnvoll ist, da bei einem Export aus WUS und anschließendem Import
  // ins WAS die Namen immer an ALLE GruppeImGebiet übernommen werden, cf. WasWahlImporter#persistiereGruppenImGebiet!
  private void addGruppenImGebietMitNamenProperties(FormBuilder formBuilder, Gruppe gruppe, boolean propertiesAufGebietenReadonly, boolean globalReadonly) {
    if (isGruppenBearbeitbar()) {
      Collection<GruppeImGebiet> gruppenImGebietMitNamen = collectGruppenImGebietMitNamen(gruppe);

      if (!gruppenImGebietMitNamen.isEmpty()) {
        if (!globalReadonly && !propertiesAufGebietenReadonly) {
          getMessages().addWarnMessage("gruppe.edit.namen.auf.gebiet.vorhanden.message");
        }

        formBuilder.addSeparator("gruppe.edit.namen.auf.gebiet.vorhanden.separator");

        for (GruppeImGebiet gruppeImGebiet : gruppenImGebietMitNamen) {
          GruppeImGebietProperties gruppeImGebietProperties = gruppeImGebiet.getProperties();

          formBuilder.addProperty(new ReadOnlyStringProperty(getMessage(GruppeImGebietConstants.MESSAGE_KEY_GEBIET_ID_EINZAHL), gruppeImGebiet.getGebiet().getName()));
          gruppeViewFormBuilder.addNamenProperty(formBuilder, gruppe, gruppeImGebietProperties.getNameProperty(), gruppeImGebietProperties.getKurznameProperty(),
              gruppeImGebietProperties.getZusatzbezeichnungProperty(), true);

          formBuilder.addSeparator();
        }
      }
    }
  }

  protected boolean isGruppenBearbeitbar() {
    return true; // es gibt kaum einen vernünftigen Grund, das zu verbieten
  }

  private Collection<GruppeImGebiet> collectGruppenImGebietMitNamen(Gruppe gruppe) {
    return gruppe.getGruppenImGebiet().stream() //
        .filter(gruppeImGebiet -> gruppeImGebiet.hasName() || gruppeImGebiet.hasKurzname()) //
        .collect(toSet());
  }
}
