
package de.ivu.elect.dokumente.stimmeingabe;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeDocumentExportContext;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.exchange.wahlhelfereinsatz.WasWahlhelfereinsatzCsvDTO;

public class StimmeingabeDocumentContext extends CoreElectContext {

  private static final long serialVersionUID = 1L;

  private final boolean documentFuerWahlgebietRequired;

  private final boolean sectionErfassteStimmzettelExcluded;

  private final boolean sectionZaehllisteElektronischExcluded;

  private final boolean eingabenExcluded;

  private final Map<Gebiet, List<WasWahlhelfereinsatzCsvDTO>> wahlhelferEinsaetzeProGebiet;

  public StimmeingabeDocumentContext(CoreElectContext coreElectContext, StimmeingabeDocumentExportContext exportContext) {
    this(coreElectContext, exportContext.isDocumentFuerWahlgebietRequired(), exportContext.isSectionErfassteStimmzettelExcluded(), exportContext.isSectionZaehllisteElektronischExcluded(),
        exportContext.isEingabenExcluded(),
        extractWahlhelfereinsaetzeProGebiet(exportContext));
  }

  private static Map<Gebiet, List<WasWahlhelfereinsatzCsvDTO>> extractWahlhelfereinsaetzeProGebiet(StimmeingabeDocumentExportContext exportContext) {
    Map result = exportContext.getOrDefault(WasWahlhelfereinsatzCsvDTO.CONTEXT_PARAMETER_NAME, Map.class, Collections.emptyMap());
    return result;
  }

  private StimmeingabeDocumentContext(CoreElectContext coreElectContext, boolean documentFuerWahlgebietRequired, boolean sectionErfassteStimmzettelExcluded,
      boolean sectionZaehllisteElektronischExcluded, boolean eingabenExcluded, Map<Gebiet, List<WasWahlhelfereinsatzCsvDTO>> wahlhelfereinsaetzeProGebiet) {
    super(coreElectContext);

    this.documentFuerWahlgebietRequired = documentFuerWahlgebietRequired;

    this.sectionErfassteStimmzettelExcluded = sectionErfassteStimmzettelExcluded;
    this.sectionZaehllisteElektronischExcluded = sectionZaehllisteElektronischExcluded;

    this.eingabenExcluded = eingabenExcluded;

    this.wahlhelferEinsaetzeProGebiet = wahlhelfereinsaetzeProGebiet == null ? Collections.emptyMap() : wahlhelfereinsaetzeProGebiet;
  }

  public boolean isDocumentFuerWahlgebietRequired() {
    return documentFuerWahlgebietRequired;
  }

  public boolean isSectionErfassteStimmzettelExcluded() {
    return sectionErfassteStimmzettelExcluded;
  }

  public boolean isSectionZaehllisteElektronischExcluded() {
    return sectionZaehllisteElektronischExcluded;
  }

  public boolean isGebieteAnzahlenWahlberechtigteIncluded() {
    return isEingabenExcluded(); // ELECTKOM-62
  }

  public boolean isEingabenAnzahlenWahlberechtigteIncluded() {
    return !isEingabenExcluded();
  }

  public boolean isEingabenAnzahlenWaehlerIncluded() {
    return !isEingabenExcluded();
  }

  public boolean isEingabenAnzahlenStimmenIncluded() {
    return !isEingabenExcluded();
  }

  private boolean isEingabenExcluded() {
    return eingabenExcluded;
  }

  public List<WasWahlhelfereinsatzCsvDTO> getWahlhelferEinsaetzeFuerGebiet(Gebiet gebiet) {
    return wahlhelferEinsaetzeProGebiet.getOrDefault(gebiet, Collections.emptyList());
  }
}
