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

import de.ivu.elect.business.ergebniskonflikt.boundary.ErgebnisKonfliktExtendedDAO;
import de.ivu.elect.business.ergebniskonflikt.entity.ErgebnisKonflikt;
import de.ivu.elect.business.ergebniskonflikt.entity.ErgebnisKonfliktCustomData;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.ergebniskonflikt.ErgebnisKonfliktReihenfolgeKandidaturFestlegenEditView;
import de.ivu.elect.presentation.ergebniskonflikt.ErgebnisKonfliktSearchView;
import de.ivu.elect.presentation.menu.AbstractMenuItemEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

import javax.inject.Inject;

import static de.ivu.elect.jee.faces.FacesContextUtil.requireDevelopmentStage;

// NOTE, dass dieser Menüeintrag NUR FÜR ENTWICKLER gedacht ist!!!
public class AlleErgebnisKonflikteIrgendwieLoesenDeveloperMenuItemEntry extends AbstractMenuItemEntry {

  private static final long serialVersionUID = 1L;

  @View
  @Inject
  private transient ErgebnisKonfliktSearchView ergebnisKonfliktSearchView;

  @View
  @Inject
  private transient ErgebnisKonfliktReihenfolgeKandidaturFestlegenEditView ergebnisKonfliktReihenfolgeKandidaturFestlegenEditView;

  @Inject
  ErgebnisKonfliktExtendedDAO konfliktDAO;

  public AlleErgebnisKonflikteIrgendwieLoesenDeveloperMenuItemEntry() {
    super();
  }

  @Override
  public boolean isRendered() {
    // NOTE, dass dieser Menüeintrag NUR FÜR ENTWICKLER gedacht ist!!!
    return FacesContextUtil.isDevelopmentStage();
  }

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

  @Override
  protected AbstractGebietSecurity getGebietSecurity() {
    return KEINE_GEBIET_SECURITY; // Development-Mode
  }

  @Override
  public String getTargetViewId() {
    // Action ausführen
    return null;
  }

  @Override
  public String doAction() {
    requireDevelopmentStage();

    for (ErgebnisKonflikt ergebnisKonfliktSV : ergebnisKonfliktSearchView.getSearchResult()) {
      ErgebnisKonflikt ergebnisKonflikt = konfliktDAO.findByPrimaryKey(ergebnisKonfliktSV.getPk());


      if (!ergebnisKonflikt.isGeloest()) {
        loeseKonflikt(ergebnisKonflikt);
      }
    }

    // Neu Laden
    ergebnisKonfliktSearchView.resetSearchResult();

    return ErgebnisKonfliktSearchView.VIEW_ID;
  }

  protected void loeseKonflikt(ErgebnisKonflikt ergebnisKonflikt) {
    ErgebnisKonfliktCustomData customData = (ErgebnisKonfliktCustomData) ergebnisKonflikt.getCustomData();
    if (ErgebnisKonfliktReihenfolgeKandidaturFestlegenEditView.VIEW_ID.equals(customData.getErgebnisKonfliktLoesungViewId())) {
      ergebnisKonfliktReihenfolgeKandidaturFestlegenEditView.setEntity(ergebnisKonflikt);
      ergebnisKonfliktReihenfolgeKandidaturFestlegenEditView.save();

      // zurücksetzen -- ohne das setEntity() kommt eine Exception
      ergebnisKonfliktReihenfolgeKandidaturFestlegenEditView.setEntity(ergebnisKonflikt);
      ergebnisKonfliktReihenfolgeKandidaturFestlegenEditView.reset();
    }
  }

  @Override
  protected String getLabel() {
    return getMessage(getLabelKey(), "Alle Losentscheide irgendwie lösen (NUR ZUR ENTWICKLUNG)");
  }

  @Override
  public String getLabelKey() {
    return Messages.LOCALIZED_MESSAGE_ONLY_MSG_KEY;
  }
}
