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

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import de.ivu.elect.business.wahl.entity.Wahl;


import static java.util.Collections.singletonList;

public enum GebietPruefkennzeichenGenerierenEindeutigkeit {

  WAHLUEBERGREIFEND_EINDEUTIG {
    @Override
    public List<Set<Gebiet>> gruppiereNachEindeutigkeit(Set<Gebiet> gebiete) {
      return singletonList(gebiete);
    }
  },
  WAHL_EINDEUTIG{
    @Override
    public List<Set<Gebiet>> gruppiereNachEindeutigkeit(Set<Gebiet> gebiete) {

      Map<Wahl, List<Gebiet>> gebieteNachWahl = gebiete.stream().collect(Collectors.groupingBy(Gebiet::getWahl));

      return gebieteNachWahl.values().stream().map(HashSet::new)
          .collect(Collectors.toCollection(() -> new ArrayList<>(gebieteNachWahl.size())));
    }
  },
  NICHT_EINDEUTIG {
    @Override
    public List<Set<Gebiet>> gruppiereNachEindeutigkeit(Set<Gebiet> gebiete) {

      return gebiete.stream().map(Collections::singleton).collect(Collectors.toCollection(() -> new ArrayList<>(gebiete.size())));
    }
  };

  public abstract List<Set<Gebiet>> gruppiereNachEindeutigkeit(Set<Gebiet> gebiete);
}
