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

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

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map.Entry;

import javax.annotation.Nullable;
import javax.inject.Inject;

import org.apache.deltaspike.core.api.scope.ConversationGroup;

import de.ivu.elect.business.gebietsbaum.boundary.NlWasGebietsgruppierungEdit;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.NlGebietsgruppierungArt;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.presentation.ergebnis.menu.NlWasModelNa311BulkExportMenuItemEntry;
import de.ivu.elect.presentation.ergebnis.menu.NlWasModelNa312BulkExportMenuItemEntry;
import de.ivu.elect.presentation.gebietsbaum.NlWasGebietsgruppierungBulkEditView;
import de.ivu.elect.presentation.gebietsbaum.NlWasGebietsgruppierungConversationStore;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public class NlWasGebietsgruppierungKorrekturenErfassungsgebieteBulkEditMenuItemEntry extends AbstractGebietMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient NlWasGebietsgruppierungEdit nlWasGebietsgruppierungEdit;

  @Inject
  private transient NlWasModelNa311BulkExportMenuItemEntry nlWasModelNa311BulkExportMenuItemEntry; // Ist das Gegenstück zu Model Na 31-2 (ehemals Model II) bei DEZENTRALER Erfassung.

  @Inject
  private transient NlWasModelNa312BulkExportMenuItemEntry nlWasModelNa312BulkExportMenuItemEntry; // Ist das Gegenstück zu Model Na 31-1 (ehemals Model N 11) bei ZENTRALER Erfassung.

  @Inject
  @ConversationGroup(NlWasGebietsgruppierungConversationStore.class)
  private transient NlWasGebietsgruppierungConversationStore nlWasGebietsgruppierungConversationStore;

  public NlWasGebietsgruppierungKorrekturenErfassungsgebieteBulkEditMenuItemEntry() {
    super();
  }

  @Override
  public boolean isRendered() {
    return super.isRendered() && (nlWasModelNa311BulkExportMenuItemEntry.isExporterVorhanden() || nlWasModelNa312BulkExportMenuItemEntry.isExporterVorhanden());
  }

  @Override
  protected UseCasePermission getUseCasePermission() {
    return NlWasGebietsgruppierungBulkEditView.USE_CASE_PERMISSION;
  }

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return KEINE_GEBIET_SECURITY;
  }

  @Override
  public String doAction() {
    return doAction(null);
  }

  public String doAction(@Nullable String postSaveViewId) {
    Gebiet gebiet = getSelectedGebiet();

    if (gebiet != null) {
      Wahl wahl = gebiet.getWahl();

      Collection<NlGebietsgruppierungArt> arten = NlGebietsgruppierungArt.collectArtenKorrekturenErfassungsgebiete(wahl);

      nlWasGebietsgruppierungConversationStore.setPostSaveViewId(postSaveViewId);

      nlWasGebietsgruppierungConversationStore.setEntityPKs(nlWasGebietsgruppierungEdit.collectGebietsgruppierungenKorrekturenErfassungsgebiete(wahl, arten).entrySet().stream() //
          .sorted((one, another) -> Long.compare(one.getKey().ordinal(), another.getKey().ordinal())) //
          .map(Entry::getValue) //
          .collect(toList()));
    }

    return NlWasGebietsgruppierungBulkEditView.VIEW_ID;
  }

  @Override
  public String getTargetViewId() {
    return null; // and doAction...
  }

  @Override
  protected List<String> getAdditionalTopicViewIds() {
    List<String> result = new ArrayList<>(super.getAdditionalTopicViewIds());
    result.add(NlWasGebietsgruppierungBulkEditView.VIEW_ID);

    return result;
  }

  @Override
  public String getLabelKey() {
    return "gebietsgruppierung.bulk.edit.menu.item.label";
  }

  @Override
  public String getIcon() {
    return getIcons().getIconEdit();
  }
}
