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

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;


import static java.util.Arrays.asList;

/**
 *  on 15.12.2015.
 */
public enum SvgGebietDarstellung {

  NUR_GEBIETSDATEN_AKTUELLES_GEBIET {
    @Override
    public Collection<Gebiet> bestimmeZuBetrachtendeGebiet(Gebiet gebiet, Function<Gebiet, Collection<Gebiet>> untergebiete) {
      return asList(gebiet);
    }
  },
  GEBIETSDATEN_DIREKTE_UNTERGEBIETE {
    @Override
    public Collection<Gebiet> bestimmeZuBetrachtendeGebiet(Gebiet gebiet, Function<Gebiet, Collection<Gebiet>> untergebiete) {
      return untergebiete.apply(gebiet);
    }
  },
  GEBIETSDATEN_ALLER_UNTERGEBIETE {
    @Override
    public Collection<Gebiet> bestimmeZuBetrachtendeGebiet(Gebiet gebiet, Function<Gebiet, Collection<Gebiet>> untergebiete) {
      Collection<Gebiet> direkteUntergebiete = untergebiete.apply(gebiet);
      Set<Gebiet> result = new HashSet<>(direkteUntergebiete);
      for (Gebiet untergebiet : direkteUntergebiete) {
        result.addAll(bestimmeZuBetrachtendeGebiet(untergebiet, untergebiete));
      }
      return result;
    }
  },
  GEBIETSDATEN_UNTERSTER_GEBIETE {
    @Override
    public Collection<Gebiet> bestimmeZuBetrachtendeGebiet(Gebiet gebiet, Function<Gebiet, Collection<Gebiet>> untergebiete) {
      Set<Gebiet> result = new HashSet<>();

      Collection<Gebiet> untergebieteDesGebietes = untergebiete.apply(gebiet);
      if (untergebieteDesGebietes.isEmpty()) {
        result.add(gebiet);
      } else {
        for (Gebiet kind : untergebieteDesGebietes) {
          result.addAll(bestimmeZuBetrachtendeGebiet(kind, untergebiete));
        }
      }

      return result;
    }
  };

  public abstract Collection<Gebiet> bestimmeZuBetrachtendeGebiet(Gebiet gebiet, Function<Gebiet, Collection<Gebiet>> untergebiete);
}
