
package de.ivu.elect.presentation.stimmeingabe;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.presentation.stimmeingabe.status.GebietErfassungsstatus;
import de.ivu.elect.presentation.stimmeingabe.status.GebietErfassungsstatusInErgebniseingabestufe;


import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;

public enum EingangsStatusViewGebietAnzeige {

  KEINE,

  OFFEN(GebietErfassungsstatus.NOCH_KEIN_EINGANG),

  UNVOLLSTAENDIGE(GebietErfassungsstatus.UNVOLLSTAENDIG),

  AUSBLEIBENDE(GebietErfassungsstatus.AUSBLEIBEND),

  FEHLERHAFT(GebietErfassungsstatus.KANN_FEHLER_VORHANDEN, GebietErfassungsstatus.MUSS_FEHLER_VORHANDEN),

  GUELTIGE(GebietErfassungsstatus.GUELTIG),

  ALLE(GebietErfassungsstatus.NOCH_KEIN_EINGANG, GebietErfassungsstatus.KANN_FEHLER_VORHANDEN, GebietErfassungsstatus.MUSS_FEHLER_VORHANDEN,
      GebietErfassungsstatus.UNVOLLSTAENDIG,
      GebietErfassungsstatus.FIKTIV, GebietErfassungsstatus.GUELTIG, GebietErfassungsstatus.AUSBLEIBEND),

  ;

  private final Map<Ergebniseingabestufe, List<GebietErfassungsstatusInErgebniseingabestufe>> gebietErfassungsstatusInErgebniseingabestufen;

  private EingangsStatusViewGebietAnzeige(GebietErfassungsstatus... gebietErfassungsstatus) {
    this.gebietErfassungsstatusInErgebniseingabestufen = new HashMap<>();

    for (Ergebniseingabestufe ergebniseingabestufe : Ergebniseingabestufe.values()) {
      List<GebietErfassungsstatusInErgebniseingabestufe> values = new ArrayList<>();

      if (gebietErfassungsstatus != null) {
        values = Arrays.stream(gebietErfassungsstatus)
            .map(gebietErfassungsstatu -> new GebietErfassungsstatusInErgebniseingabestufe(ergebniseingabestufe, gebietErfassungsstatu))
            .collect(Collectors.toList());
      }

      this.gebietErfassungsstatusInErgebniseingabestufen.put(ergebniseingabestufe, values);
    }
  }

  public List<GebietErfassungsstatusInErgebniseingabestufe> getGebietErfassungsstatusList(Collection<Ergebniseingabestufe> ergebniseingabestufen) {
    return ergebniseingabestufen.stream()
        .flatMap(ergebniseingabestufe -> gebietErfassungsstatusInErgebniseingabestufen.getOrDefault(ergebniseingabestufe, emptyList()).stream()).distinct()
        .sorted(GebietErfassungsstatusInErgebniseingabestufe.DEFAULT_COMPARATOR).collect(Collectors.toList());
  }

  public static List<EingangsStatusViewGebietAnzeige> getAuswahl(boolean gebietErfassungsstatusUnvollstaendigAnzeigen) {
    List<EingangsStatusViewGebietAnzeige> result = new ArrayList<>(asList(values()));

    if (!gebietErfassungsstatusUnvollstaendigAnzeigen) {
      result.remove(UNVOLLSTAENDIGE);
    }

    return result;
  }
}
