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

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.GebietConstants;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartConstants;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartIcon;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartProperties;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.gebietsbaum.GebietsartenAnpassbar;

public class GebietsartViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietsartenAnpassbar gebietsartenAnpassbar;

  @Inject
  private transient GebietsartUniqueUKFacesValidator gebietsartNameUniqueUKFacesValidator;

  public GebietsartViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Gebietsart gebietsart) {
    GebietsartProperties gebietsartProperties = gebietsart.getProperties();

    boolean gebietsartNameReadonly = isGebietsartNameReadonly(gebietsart);

    LambdaEnumProperty<GebietsartIcon> gebietsartIconProperty = gebietsartProperties.getIconProperty();
    gebietsartIconProperty.setItemIconMapper((icons, gebietsartIcon) -> gebietsartIcon.getIcon());

    // ELECT-6811, cf. GebietsartColumnBuilder#getColumnEntriesSorted!
    formBuilder.addProperty(gebietsartProperties.getNameProperty()).withValidatorAndPk(gebietsartNameUniqueUKFacesValidator, gebietsart.getPk()).withReadonly(gebietsartNameReadonly);
    formBuilder.addProperty(gebietsartProperties.getTitelProperty());
    formBuilder.addProperty(gebietsartProperties.getPositionProperty());
    formBuilder.addProperty(gebietsartIconProperty);
    formBuilder.addProperty(gebietsartProperties.getKennzeichenProperty());
    formBuilder.addProperty(gebietsartProperties.getDarstellungProperty()).withTooltip(getDarstellungTooltip(getMessages()));
    formBuilder.addProperty(gebietsartProperties.getBezirksartProperty()).readonly(); // es darf nur einen Reservebezirk, ein Stimmbezirk und einen Briefwahlbezirk geben
    formBuilder.addProperty(gebietsartProperties.getSystemGebietsebeneMitLeererAuswahlProperty());
  }

  protected boolean isGebietsartNameReadonly(Gebietsart gebietsart) {
    return !gebietsartenAnpassbar.isGebietsartenErweiterbar() || !gebietsart.getBezirksart().isKeine();
  }

  public static String getDarstellungTooltip(Messages messages) {
    String gebiet = messages.getMessageForMessageKey(GebietConstants.MESSAGE_KEY_ENTITY_EINZAHL);
    String gebietsart = messages.getMessageForMessageKey(GebietsartConstants.MESSAGE_KEY_ENTITY_EINZAHL);

    return messages.getMessageForMessageKey("gebietsart.darstellung.tooltip", //
        messages.getMessageForMessageKey("gebiet.bezirk.nummer.oder.nummer") + " (" + gebiet + ")", //
        messages.getMessageForMessageKey(GebietConstants.MESSAGE_KEY_NAME_EINZAHL) + " (" + gebiet + ")", //
        messages.getMessageForMessageKey(GebietConstants.MESSAGE_KEY_KUERZEL_EINZAHL) + " (" + gebiet + ")", //
        messages.getMessageForMessageKey(GebietsartConstants.MESSAGE_KEY_TITEL_EINZAHL) + " (" + gebietsart + ")", //
        messages.getMessageForMessageKey(GebietsartConstants.MESSAGE_KEY_KENNZEICHEN_EINZAHL) + " (" + gebietsart + ")", //
        messages.getMessageForMessageKey(GebietConstants.MESSAGE_KEY_NUMMER_EINZAHL) + " (" + gebiet + ")" //
    );
  }
}
