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

import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Nonnull;

import de.ivu.elect.business.anschrift.entity.AbstractAnschrift;
import de.ivu.elect.business.geodata.entity.GeodataOrt;
import de.ivu.elect.business.geodata.entity.GeodataPlz;
import de.ivu.elect.business.geodata.entity.GeodataPlzConstants;
import de.ivu.elect.business.geodata.entity.GeodataPlzUK;
import de.ivu.elect.jee.presentation.dynamicform.AbstractSelectManyAutoCompleteProperty;

// NOTE, dass GeodataPlzUK als POJO verwendet wird, weil diese Klasse die PLZ enthält und zusätzlich bereits #equals und
// #hashCode implementiert!
public class GeodataOrtGeodataPlzAutoCompleteProperty extends AbstractSelectManyAutoCompleteProperty<GeodataPlzUK> {

  private final GeodataOrt geodataOrt;

  public GeodataOrtGeodataPlzAutoCompleteProperty(GeodataOrt geodataOrt, GeodataOrtGeodataPlzAutoCompleteOptionsProvider optionsProvider) {
    super(optionsProvider);

    this.geodataOrt = geodataOrt;
  }

  @Override
  public boolean getDefaultRequired() {
    return false;
  }

  @Override
  protected String getDefaultLabelMsgKey() {
    return GeodataPlzConstants.MESSAGE_KEY_ENTITY_MEHRZAHL;
  }

  @Override
  public int getMinQueryLength() {
    return AbstractAnschrift.PLZ_DEFAULT_LENGTH - 1;
  }

  @Override
  protected List<GeodataPlzUK> getValueInternal() {
    return asGeodataPlzUks(geodataOrt.getGeodataPostleitzahlen());
  }

  @Override
  protected void setValueInternal(List<GeodataPlzUK> geodataPlzUks) {
    geodataOrt.removeGeodataPostleitzahlen();
    geodataOrt.addGeodataPostleitzahlen(asGeodataPlz(geodataPlzUks));
  }

  @Override
  protected boolean isForceOptionSelection() {
    return false;
  }

  @Override
  protected String formatOptionLabel(@Nonnull GeodataPlzUK geodataPostleitzahl) {
    return geodataPostleitzahl.getPlz();
  }

  private List<GeodataPlzUK> asGeodataPlzUks(List<GeodataPlz> geodataPlzTemplates) {
    return geodataPlzTemplates.stream().map(GeodataPlz::getGeodataPlzUK).collect(Collectors.toList());
  }

  private List<GeodataPlz> asGeodataPlz(List<GeodataPlzUK> geodataPlzUkTemplates) {
    return geodataPlzUkTemplates.stream().map(geodataPlzUk -> {
      GeodataPlz geodataPlz = new GeodataPlz();
      geodataPlz.setPlz(geodataPlzUk.getPlz());

      return geodataPlz;
    }).collect(Collectors.toList());
  }
}
