
package de.ivu.elect.presentation.ergebnis.exchange;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisDateiQuelle;
import de.ivu.elect.business.ergebnis.boundary.StimmenImporter;
import de.ivu.elect.business.ergebnis.control.StimmenImportContext;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.exchange.control.AbstractImporter;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeNichtGefundenViolation;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.exchange.AbstractViolation;
import de.ivu.elect.jee.exchange.Violations;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.exchange.ImportDescription;

@Named(StimmenImportBestaetigenView.COMPONENT_NAME)
@View(viewId = StimmenImportBestaetigenView.VIEW_ID, useCase = UseCasePermission.STIMMEN_IMPORTIEREN)
public class StimmenImportBestaetigenView extends AbstractErgebnisImportBestaetigenView<List<Stimmen>, StimmenImportContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmenImportBestaetigenView";

  public static final String VIEW_ID = "/ergebnis/stimmen-import-bestaetigen.xhtml";

  @Inject
  private transient StimmenImporter stimmenImporter;

  @Inject
  private transient StimmenImportDescription stimmenImportDescription;

  public StimmenImportBestaetigenView() {
    super();
  }

  @Override
  protected StimmenImportContext createDefaultContext() {
    return new StimmenImportContext(getSelectedWahl(), ErgebnisDateiQuelle.EINGABEWERTE, Ergebnisart.VORPERIODE);
  }

  @Override
  protected AbstractImporter<List<Stimmen>, StimmenImportContext, ? > getImporter() {
    return stimmenImporter;
  }

  @Override
  protected ImportDescription getImportDescription() {
    return stimmenImportDescription;
  }

  @Override
  public boolean isBtnImportierenDisabled() {
    return isRefreshRequired() || !isImportierenMitKummlierenPossible() && super.isBtnImportierenDisabled();
  }

  @Override
  public void checkImportReportContainsViolations() {
    if (isImportReportContainsErrorsButImportWithKumulierenPossible()) {
      addWarningMessage("stimmen.import.fehlende.gruppen.zu.uebrige.kumulieren.fehler.vorhanden.aber.import.moeglich", getMessage("gruppe.system.name." + SystemGruppe.UEBRIGE.name()));
    } else {
      super.checkImportReportContainsViolations();
    }
  }

  protected boolean isImportReportContainsErrorsButImportWithKumulierenPossible() {
    return isImportReportContainingErrors() && isImportierenMitKummlierenPossible();
  }

  private boolean isImportierenMitKummlierenPossible() {
    Violations violations = getImportReport().getViolations();

    for (AbstractViolation violation : violations.getViolations()) {
      if (isNotGruppeNichtGefundenViolation(violation)) {
        return false;
      }
    }

    return true;
  }

  private boolean isNotGruppeNichtGefundenViolation(AbstractViolation violation) {
    return !isGruppeNichtGefundenViolation(violation);
  }

  protected boolean isGruppeNichtGefundenViolation(AbstractViolation violation) {
    return violation instanceof GruppeNichtGefundenViolation;
  }
}
