package de.ivu.elect.business.internet.boundary;

import java.util.List;

import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.internet.entity.InternetWidget;
import de.ivu.elect.jee.entity.customdata.DefaultCustomData;

@Stateless
@Specializes
public class CoreInternetWidgetBoundaryCreate extends InternetWidgetBoundaryCreate {

  @Inject
  private transient InternetWidgetDAO internetWidgetDAO;

  public InternetWidget copy(InternetWidget entityNotAttched) {
    var entity = internetWidgetDAO.attach(entityNotAttched);
    var copy = new InternetWidget(new DefaultCustomData());
    entity.copyEntityAttributesUsingSetter(copy);
    if (StringUtils.isNotBlank(copy.getSprungmarke())) {
      copy.setSprungmarke(copy.getSprungmarke() + " (copy)");
    }
    copy.getCustomDataStorage().clearCustomDataCache();
    var internetSeite = entity.getInternetSeite();
    copy.setInternetSeite(internetSeite);

    if (internetSeite != null) {
      if (copy.getZeile() == 0L) {
        var maxPositionHeader = findeMaxPositionHeader(internetWidgetDAO.findByInternetSeiteOrdered(internetSeite));
        copy.setPosition(maxPositionHeader + 1);
      } else {
        var maxZeile = findeMaxZeile(internetWidgetDAO.findByInternetSeiteOrdered(internetSeite));
        copy.setZeile(maxZeile + 1);
      }
    }
    copy.setIdentifier(null); // neu vergeben
    save(copy);
    return copy;
  }

  private long findeMaxZeile(List<InternetWidget> widgets) {
    return widgets.stream().mapToLong(InternetWidget::getZeile).max().orElse(0L);
  }

  private long findeMaxPositionHeader(List<InternetWidget> widgets) {
    return widgets.stream().filter(w -> w.getZeile() == 0L).mapToLong(InternetWidget::getPosition).max().orElse(0L);
  }

}
