
package de.ivu.elect.was.exchange.stimmeingabe;

import java.io.Serializable;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.EmlImportMapper;
import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.security.control.ElectCommonPrincipalNoScope;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeImportContext;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungDAO;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.nl.eml.EmlWrapper;
import de.ivu.elect.presentation.security.NlPrivatePublicKeyNeeded;

@Stateless
public class Eml510StimmeingabeImportMapperHelper implements Serializable {

  private static final Logger LOG = LoggerFactory.getLogger(Eml510StimmeingabeImportMapperHelper.class);

  private static final long serialVersionUID = 1L;

  public static final String SIGNATUR_IGNORIEREN = "SIGNATUR_IGNORIEREN";

  @Inject
  private transient NlPrivatePublicKeyNeeded nlPrivatePublicKeyNeeded;

  @Inject
  private transient WahldurchfuehrungDAO wahldurchfuehrungDAO;

  @Inject
  private transient CurrentCustomer currentCustomer;

  public Eml510StimmeingabeImportMapperHelper() {
    super();
  }

  public boolean isBackupRestoreImportZulaessig(EmlImportMapper emlImportMapper, Wahl wahl) {
    return emlImportMapper.isBackupRestoreEnabled(wahl) /* TODO ELECTVAPP-1324 && isBackupRestorePrincipal() */;
  }

  public boolean isStimmeingabeImportZulaessig(EmlImportMapper emlImportMapper, Wahl wahl) {
    return !emlImportMapper.isBackupRestoreEnabled(wahl) /* TODO ELECTVAPP-1324 && !isBackupRestorePrincipal() */;
  }

  private boolean isBackupRestorePrincipal() {
    ElectCommonPrincipal pricipal = ElectCommonPrincipalNoScope.getPricipal();

    return pricipal.hasUseCasePermission(UseCasePermission.STIMMEINGABE_IMPORTIEREN) && pricipal.hasUseCasePermission(UseCasePermission.STIMMEINGABE_IMPORTIEREN_CUSTOM); // ELECT-11885
  }

  public boolean isSignaturNotwendig(EmlWrapper emlWrapper, StimmeingabeImportContext context) {
    if (Boolean.TRUE.toString().equalsIgnoreCase(context.get(SIGNATUR_IGNORIEREN, String.class))) {
      return false;
    }

    Wahldurchfuehrung wahldurchfuehrung = wahldurchfuehrungDAO.attach(context.getWahldurchfuehrung());

    if (nlPrivatePublicKeyNeeded.isPublicKeyNeeded(wahldurchfuehrung.getMandant())) {
      return !bestimmeErgebniseingabestufe(Eml510.from(emlWrapper.getContent().getId()), wahldurchfuehrung).isInErgebnisUebernehmbar();
    }

    return false;
  }

  public Ergebniseingabestufe bestimmeErgebniseingabestufe(Eml510 eml510, Wahldurchfuehrung wahl) {
    if (NlWahlart.isWasPSB(wahl, currentCustomer.getCustomer())) {
      LOG.info("isPSB");
      return eml510.getPsbErgebniseingabestufe();
    }

    if (NlWahlart.isWasHSB(wahl, currentCustomer.getCustomer())) {
      LOG.info("isHSB");
      return eml510.getHsbErgebniseingabestufe();
    }

    if (NlWahlart.isWasCSB(wahl, currentCustomer.getCustomer())) {
      LOG.info("isCSB");
      return eml510.getCsbErgebniseingabestufe();
    }

    return Ergebniseingabestufe.VORSTUFE_01;
  }
}
