
package de.ivu.elect.business.gruppeimgebiet.control;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;

import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gruppe.boundary.GruppeDAO;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietDAO;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietHierarchyBuilder;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietTK;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;

/**
 * Version des {@link GruppeImGebietCache}, die zusätzlich die gesamte Hierarchy anlegt.
 *
 * Nicht direkt injizieren lassen => {@link GruppeImGebietCacheFactory} verwenden
 *
 */
class GruppeImGebietCompleteHierarchyCache extends AbstractGruppeImGebietCache {

  private final GruppeImGebietHierarchyBuilder gruppeImGebietHierarchyBuilder;

  GruppeImGebietCompleteHierarchyCache(WahlDAO wahlDAO, GebietDAO gebietDAO, GruppeDAO gruppeDAO,
      GruppeImGebietDAO gruppeImGebietDAO, GruppeImGebietFactory gruppeImGebietFactory, Wahl wahl,
      GruppeImGebietHierarchyBuilder gruppeImGebietHierarchyBuilder) {
    super(wahlDAO, gebietDAO, gruppeDAO, gruppeImGebietDAO, gruppeImGebietFactory, wahl);
    this.gruppeImGebietHierarchyBuilder = gruppeImGebietHierarchyBuilder;
  }

  @Override
  protected Collection<GruppeImGebiet> findGruppenImGebietByWahl(Wahl wahl) {
    // Nichts vorladen, da unklar ist, ob  Hierarchien vollständig sind. 
    return Collections.emptyList();
  }

  @Override
  protected Collection<GruppeImGebiet> persistUndGibNeueEntitaetenZurueck(GruppeImGebiet gruppeImGebiet) {
    return saveAndCompleteHierarchy(gruppeImGebiet, getGruppenImGebietPerGruppeImGebietTk());
  }

  private Collection<GruppeImGebiet> saveAndCompleteHierarchy(GruppeImGebiet gruppeImGebiet,
      Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietPerGruppeImGebietTk) {
    return gruppeImGebietHierarchyBuilder.saveAndCompleteHierarchy(gruppeImGebiet, gruppenImGebietPerGruppeImGebietTk);
  }

}
