
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.Customer;
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(), wahldurchfuehrung)) {
      Eml510 eml510 = Eml510.from(emlWrapper.getContent().getId());

      if (!bestimmeErgebniseingabestufe(eml510, wahldurchfuehrung).isInErgebnisUebernehmbar()) {
        return true;
      }

      if (NlWahlart.isNBSBC(wahldurchfuehrung)) {
        return Eml510.EML510b.equals(eml510); // ELECT-16725
      }

      if (NlWahlart.isHSBC(wahldurchfuehrung)) {
        return Eml510.EML510c.equals(eml510); // ELECT-15308
      }
    }

    return false;
  }

  public Ergebniseingabestufe bestimmeErgebniseingabestufe(Eml510 eml510, Wahldurchfuehrung wahl) {
    Customer customer = currentCustomer.getCustomer();

    if (NlWahlart.isWasGSB(wahl, customer)) {
      if (NlWahlart.isWasNBSB(wahl, customer)) {
        LOG.info("isNBSB");

        return eml510.getNbsbErgebniseingabestufe();
      }

      if (NlWahlart.isWasNBSBC(wahl, customer)) {
        LOG.info("isNBSBC");

        return eml510.getNbsbcErgebniseingabestufe();
      }

      LOG.info("isGSB");

      return eml510.getGsbErgebniseingabestufe();
    }

    if (NlWahlart.isWasHSB(wahl, customer)) {
      if (NlWahlart.isWasHSBC(wahl, customer)) {
        LOG.info("isHSBC");

        return eml510.getHsbcErgebniseingabestufe();
      }

      if (NlWahlart.isWasHSBB(wahl, customer)) {
        LOG.info("isHSBB");
      } else {
        LOG.info("isHSB");
      }

      return eml510.getHsbErgebniseingabestufe();
    }

    if (NlWahlart.isWasCSB(wahl, customer)) {
      LOG.info("isCSB");

      return eml510.getCsbErgebniseingabestufe();
    }

    return Ergebniseingabestufe.VORSTUFE_01;
  }
}
