
package de.ivu.elect.business.geodata.control;

import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;

import de.ivu.elect.business.geodata.entity.GeodataOrt;
import de.ivu.elect.business.geodata.entity.GeodataPlz;

public class GeodataOrtCreate extends AbstractGeodataOrtCreate {

  @Inject
  private GeodataPlzCreate geodataPlzCreate;

  public GeodataOrtCreate() {
    super();
  }

  @Override
  public void save(GeodataOrt geodataOrtTemplate) {
    updateOrCreate(geodataOrtTemplate);
  }

  private void updateOrCreate(GeodataOrt geodataOrtTemplate) {
    Set<GeodataPlz> geodataPlzTemplates = new HashSet<>(geodataOrtTemplate.getGeodataPostleitzahlen());

    GeodataOrt geodataOrt = findOrCreate(geodataOrtTemplate);
    geodataOrt.addGeodataPostleitzahlen(attachAll(geodataPlzTemplates));
  }

  private GeodataOrt findOrCreate(GeodataOrt geodataOrtTemplate) {
    GeodataOrt geodataOrt = tryFind(geodataOrtTemplate);

    if (nonNull(geodataOrt)) {
      return geodataOrt;
    }

    return create(geodataOrtTemplate);
  }

  private GeodataOrt tryFind(GeodataOrt template) {
    List<GeodataOrt> result = dao.findByOrtsnameAndOrtsteilname(trimToEmpty(template.getOrtsname()),
        trimToEmpty(template.getOrtsteilname()));

    if (!result.isEmpty()) {
      return result.get(0);
    }

    return null;
  }

  private GeodataOrt create(GeodataOrt geodataOrtTemplate) {
    // NOTE, dass save ohne Verknüpfungen erfolgt, weil nicht alle verknüpften GeodataPlz schon persistent sein müssen.
    geodataOrtTemplate.removeGeodataPostleitzahlen();
    super.save(geodataOrtTemplate);

    return geodataOrtTemplate;
  }

  private Collection<GeodataPlz> attachAll(Collection<GeodataPlz> geodataPlzTemplates) {
    return geodataPlzCreate.attachAll(geodataPlzTemplates);
  }
}
