package de.ivu.elect.business.stimmzettel.entity;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.jee.presentation.status.OutputSeverity;


import static de.ivu.elect.business.stimmzettel.entity.StimmzettelErfassungValidationEntry.SUCCESS;

public class StimmzettelErfassungValidationResult implements Serializable {
  private static final long serialVersionUID = 1L;

  private final Map<StimmzettelKopfdatumArt, StimmzettelErfassungValidationEntry> validationResultOhneGruppe;

  private final Map<StimmzettelKopfdatumArt, Map<Gruppe, StimmzettelErfassungValidationEntry>> validationResultMitGruppe;

  public StimmzettelErfassungValidationResult(Map<StimmzettelKopfdatumArt, StimmzettelErfassungValidationEntry> validationResultOhneGruppe,
                                              Map<StimmzettelKopfdatumArt, Map<Gruppe, StimmzettelErfassungValidationEntry>> validationResultMitGruppe) {
    this.validationResultOhneGruppe = validationResultOhneGruppe;
    this.validationResultMitGruppe = validationResultMitGruppe;
  }

  public StimmzettelErfassungValidationEntry getResult(StimmzettelKopfdatumArt stimmzettelKopfdatumArt) {
    return validationResultOhneGruppe.getOrDefault(stimmzettelKopfdatumArt, SUCCESS);
  }

  public StimmzettelErfassungValidationEntry getResult(StimmzettelKopfdatumArt stimmzettelKopfdatumArt, Gruppe gruppe) {
    return validationResultMitGruppe.getOrDefault(stimmzettelKopfdatumArt, Collections.emptyMap()).getOrDefault(gruppe, SUCCESS);
  }

  public OutputSeverity getSeverity() {
    StimmzettelErfassungValidationEntry result = SUCCESS;
    for (StimmzettelErfassungValidationEntry value : validationResultOhneGruppe.values()) {
      result = result.kombiniere(value);
    }
    for (Map<Gruppe, StimmzettelErfassungValidationEntry> value : validationResultMitGruppe.values()) {
      for (StimmzettelErfassungValidationEntry entry : value.values()) {
        result = result.kombiniere(entry);
      }
    }
    return result.getOutputSeverity();
  }

  public boolean isValid() {
    return getSeverity().isSuccess();
  }

  public Set<StimmzettelKopfdatumArt> getStimmzettelKopfdatumArtenVorher(Collection<StimmzettelKopfdatumArt> stimmzettelKopfdatumArten) {
    Set<StimmzettelKopfdatumArt> result = new HashSet<>();

    for (StimmzettelKopfdatumArt andereArt : StimmzettelKopfdatumArt.values()) {
      if (stimmzettelKopfdatumArten.contains(andereArt)) {
        return result;
      }

      if (validationResultOhneGruppe.containsKey(andereArt) || validationResultMitGruppe.containsKey(andereArt)) {
        result.add(andereArt);
      }

    }

    return result;
  }

}
