
package de.ivu.elect.presentation.stimmeingabe;

import java.util.Objects;

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.NlWasRollen;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;

@Specializes
public class NlStimmeingabeSecurity extends StimmeingabeSecurity {

  public NlStimmeingabeSecurity() {
    super();
  }

  public boolean isAktuellerErfasserErfasst() {
    return getPrincipal().hasUseCasePermission(UseCasePermission.STIMMEINGABE_CREATE); // Einfache Annahme ohne fixe Rolle oder Kennung auszuwerten...
  }

  public boolean isAktuellerErfasserKontrolliert() {
    return getPrincipal().hatRolle(NlWasRollen.VERKIEZINGSLEIDER.getRolleName());
  }

  @Override
  public boolean isBtnErfassungEntsperrenRendered(StimmeingabeErfassenContext context, boolean superBtnErfassungEntsperrenRendered) {
    return isAktuellerErfasserErfasst() && super.isBtnErfassungEntsperrenRendered(context, superBtnErfassungEntsperrenRendered);
  }

  @Override
  public boolean isBtnFehlerBestaetigenRendered(StimmeingabeErfassenContext context, boolean superBtnFehlerBestaetigenRendered) {
    if (super.isBtnFehlerBestaetigenRendered(context, superBtnFehlerBestaetigenRendered)) {
      Ergebniseingang letzterErgebniseingang = context.getLetzterErgebniseingangAktuell();

      return isErgebniseingangErzeugtDurchAktuellenErfasserUeberschreibbar(context, letzterErgebniseingang)
          || isErgebniseingangErzeugtDurchAnderenErfasserUeberschreibbar(context, letzterErgebniseingang);
    }

    return false;
  }

  @Override
  protected boolean isLetzterErgebniseingangOhneMussFehlerUeberschreibbar(StimmeingabeErfassenContext context) {
    if (isLetzterErgebniseingangUngueltigKannFehler(context)) { // ELECT-9874
      return isErgebniseingangErzeugtDurchAktuellenErfasserUeberschreibbar(context, context.getLetzterErgebniseingangAktuell());
    }

    return super.isLetzterErgebniseingangOhneMussFehlerUeberschreibbar(context);
  }

  private boolean isErgebniseingangErzeugtDurchAktuellenErfasserUeberschreibbar(StimmeingabeErfassenContext context, Ergebniseingang ergebniseingang) {
    return ergebniseingang != null && Objects.equals(context.getErgebniseingang().getErfasser(), ergebniseingang.getErfasser());
  }

  private boolean isErgebniseingangErzeugtDurchAnderenErfasserUeberschreibbar(StimmeingabeErfassenContext context, Ergebniseingang ergebniseingang) {
    if (isAktuellerErfasserKontrolliert()) {
      return ergebniseingang != null && (ergebniseingang.getErgebniseingabestufe().isInErgebnisUebernehmbar() || !ergebniseingang.getErgebniseingangsherkunft().isBenutzerEingabe()); // ELECT-10500
    }

    return false;
  }
}
