
package de.ivu.elect.presentation.security;

import java.util.Map;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;
import javax.persistence.NoResultException;

import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.control.WahlExtendedAttacher;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlPK;

@Specializes
public class CoreElectRedirectParameterEvaluation extends ElectRedirectParameterEvaluation {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelector wahlSessionSelect;

  @Inject
  private transient WahlExtendedAttacher wahlExtendedDAO;

  @Inject
  private transient WahlZurBearbeitungAuswaehlen wahlZurBearbeitungAuswaehlen;

  public CoreElectRedirectParameterEvaluation() {
    super();
  }

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

  @Override
  public boolean isWahlWechselMoeglich() {
    return true;
  }

  @Override
  protected void setzWahlAusParameter(Map<String, String> parameter) {
    super.setzWahlAusParameter(parameter);

    try {
      String wahlIdAsString = parameter.get(ElectRedirectParameterAttachement.ELECT_WAHL_ID);

      if (wahlIdAsString != null) {
        Long wahlId = null;

        try {
          wahlId = Long.parseLong(wahlIdAsString);
        } catch (NumberFormatException ignored) {
          logWarn("wahlId kann nicht geparst werden: ", wahlIdAsString);
        }

        if (wahlId != null) {
          Wahl wahlInSession = wahlSessionSelect.getEntity(); // ELECT-16111

          if (!wahlSessionSelect.isSelected() || wahlInSession != null && !wahlId.equals(wahlInSession.getId())) {
            Wahl wahl = null;

            try {
              wahl = wahlExtendedDAO.findByPrimaryKey(new WahlPK(wahlId));
            } catch (NoResultException ignored) {
            }

            if (wahl != null) {
              if (wahlZurBearbeitungAuswaehlen.isActionPossible(wahl)) {
                wahlZurBearbeitungAuswaehlen.doIt(wahl);

                logInfo("Wahl gesetzt: ", wahlIdAsString);
              } else {
                logWarn("Kein Recht für Wahl: ", wahlIdAsString);
              }
            } else {
              logWarn("Wahl nicht gefunden: ", wahlIdAsString);
            }
          }
        }
      }
    } catch (Exception ex) {
      logWarn("Fehler beim Setzen der Wahl: " + ex.getMessage(), "", ex);
    }
  }
}
