
package de.ivu.elect.wus.exchange.kandidatur;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import de.ivu.elect.business.anschrift.boundary.AnschriftFactory;
import de.ivu.elect.business.gebietsbaum.boundary.GebietFactory;
import de.ivu.elect.business.gruppe.boundary.PolitischeGruppeFactory;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietTK;
import de.ivu.elect.business.kandidatur.boundary.DirektkandidaturFactory;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturFactory;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.ListeTK;

public abstract class AbstractKandidaturImportMapper {

  @Inject
  protected transient AnschriftFactory anschriftFactory;

  @Inject
  protected transient ListenkandidaturFactory listenkandidaturFactory;

  @Inject
  protected transient DirektkandidaturFactory direktkandidaturFactory;

  @Inject
  protected transient PolitischeGruppeFactory politischeGruppeFactory;

  @Inject
  protected transient GruppeImGebietFactory gruppeImGebietFactory;

  @Inject
  protected transient GebietFactory gebietFactory;

  /**
   * Sorgt dafür, dass jede Liste als Objekt nur einmal vorkommt
   */
  protected void vereinheitlicheListen(List<Kandidatur> result) {

    Map<ListeTK, Liste> listenCache = new HashMap<>();
    for (Kandidatur kandidatur : result) {
      if (kandidatur.isListenkandidatur()) {
        Liste liste = kandidatur.getListenkandidatur().getListe();
        listenCache.put(liste.getListeTK(), liste);
      }
    }

    for (Kandidatur kandidatur : result) {
      if (kandidatur.isListenkandidatur()) {
        Liste liste = kandidatur.getListenkandidatur().getListe();
        kandidatur.getListenkandidatur().setListe(listenCache.get(liste.getListeTK()));
      }
    }
  }

  /**
   * Sorgt dafür, dass jede GruppeImGebiet als Objekt nur einmal vorkommt
   */
  protected void vereinheitlicheGruppeImGebiet(List<Kandidatur> result) {
    Map<GruppeImGebietTK, GruppeImGebiet> gruppeImGebietCache = new HashMap<>();

    for (Kandidatur kandidatur : result) {
      GruppeImGebiet gruppeImGebiet = kandidatur.getGruppeImGebiet();
      gruppeImGebietCache.put(gruppeImGebiet.getGruppeImGebietTK(), gruppeImGebiet);
    }

    for (Kandidatur kandidatur : result) {
      GruppeImGebiet gruppeImGebiet = kandidatur.getGruppeImGebiet();
      kandidatur.getWahlvorschlag().setGruppeImGebiet(gruppeImGebietCache.get(gruppeImGebiet.getGruppeImGebietTK()));
    }
  }
}
