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

import java.util.List;
import java.util.stream.Collectors;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.jee.entity.QueryDsl;


import static de.ivu.elect.business.statistik.boundary.StatistikKennzeichenSearch.kumuliereStatistikKennzeichen;

/**
 *  on 31.01.2017.
 */
public enum  StatistikKennzeichenSearchGebietauswahl {

  UNTERGEORDNETE_GEBIETE {
    @Override
    public void setQueryDslClause(QueryDsl queryDsl, QStatistikKennzeichen qStatistikKennzeichen, Gebiet gebiet) {
      // nichts zu tun
    }

    @Override
    public List<StatistikKennzeichen> filterAndMap(List<StatistikKennzeichen> result, Gebiet gebiet) {
     return result.stream()
          .filter(k -> k.getGebiet() != null)
          .filter(k -> gebiet.isInGebietshierarchieUebergeordnetesGebietVon(k.getGebiet()))
          .collect(Collectors.toList());
    }
  },
  UNTERGEORDNETE_GEBIETE_KUMULIEREN {
    @Override
    public void setQueryDslClause(QueryDsl queryDsl, QStatistikKennzeichen qStatistikKennzeichen, Gebiet gebiet) {
      // nichts zu tun
    }

    @Override
    public List<StatistikKennzeichen> filterAndMap(List<StatistikKennzeichen> result, Gebiet gebiet) {
      return kumuliereStatistikKennzeichen(UNTERGEORDNETE_GEBIETE.filterAndMap(result, gebiet), gebiet);
    }
  },
  NUR_AKTUELLES_GEBIET {
    @Override
    public void setQueryDslClause(QueryDsl queryDsl, QStatistikKennzeichen qStatistikKennzeichen, Gebiet gebiet) {
      queryDsl.eq(qStatistikKennzeichen.gebiet, gebiet);
    }

    @Override
    public List<StatistikKennzeichen> filterAndMap(List<StatistikKennzeichen> result, Gebiet gebiet) {
      return result;
    }
  };


  public abstract void setQueryDslClause(QueryDsl queryDsl, QStatistikKennzeichen qStatistikKennzeichen, Gebiet gebiet);

  public abstract List<StatistikKennzeichen> filterAndMap(List<StatistikKennzeichen> result, Gebiet gebiet);
}
