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

import static java.util.Arrays.asList;

import java.util.Collection;

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.entity.GruppeImGebiet;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;

/**
 * Laedt alle GruppenImGebiet beim ersten Zugriff, legt bei Bedarf neue an, lädt beim ersten Zugriff alle vorhandenen
 * Gruppen und Gebiete, legt immer nur die übergebene GruppeImGebiet an, wenn nicht vorhanden.
 */
class DefaultGruppeImGebietCache extends AbstractGruppeImGebietCache {

  private final GruppeImGebietCreate gruppeImGebietCreate;

  DefaultGruppeImGebietCache(WahlDAO wahlDAO, GebietDAO gebietDAO, GruppeDAO gruppeDAO,
      GruppeImGebietDAO gruppeImGebietDAO, GruppeImGebietFactory gruppeImGebietFactory, Wahl wahl,
      GruppeImGebietCreate gruppeImGebietCreate) {
    super(wahlDAO, gebietDAO, gruppeDAO, gruppeImGebietDAO, gruppeImGebietFactory, wahl);
    this.gruppeImGebietCreate = gruppeImGebietCreate;
  }

  @Override
  protected Collection<GruppeImGebiet> findGruppenImGebietByWahl(Wahl wahl) {
    return gruppeImGebietDAO.findByWahlEager(wahl);
  }

  @Override
  protected Collection<GruppeImGebiet> persistUndGibNeueEntitaetenZurueck(GruppeImGebiet gruppeImGebiet) {
    return create(gruppeImGebiet);
  }

  private Collection<GruppeImGebiet> create(GruppeImGebiet gruppeImGebiet) {
    gruppeImGebietCreate.save(gruppeImGebiet);

    return asList(gruppeImGebiet);
  }

}
