
package de.ivu.elect.was.exchange.stimmeingabe;

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

import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.boundary.GruppeFactory;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.boundary.GruppeImGebietFactory;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturFactory;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;
import de.ivu.elect.interfaces.core.GebietReferenz;
import de.ivu.elect.interfaces.core.GruppeImGebietReferenz;
import de.ivu.elect.interfaces.core.GruppeReferenz;
import de.ivu.elect.interfaces.core.KandidaturReferenz;
import de.ivu.elect.was.exchange.GebietMapper;

/**
 * Cache, um nicht ewig die gleichen Objekte zu erzeugen
 */
public class WasStimmeingabeXMLImportMapperMaps {



  private final GruppeImGebietFactory gruppeImGebietFactory;

  private final GruppeFactory gruppeFactory;

  private final ListenkandidaturFactory listenkandidaturFactory;

  private final Map<KandidaturReferenz, Listenkandidatur> listenkandidaturFuerKandidaturReferenz = new HashMap<>();

  private final Map<GebietReferenz, Wahldurchfuehrungsgebiet> wahldurchfuehrungsgebietFuerReferenz = new HashMap<>();

  private final Map<GruppeImGebietReferenz, GruppeImGebiet> gruppeImGebietFuerReferenz = new HashMap<>();

  private final Map<GruppeReferenz, Gruppe> gruppeFuerReferenz = new HashMap<>();

  private final Map<de.ivu.elect.interfaces.core.ReferendumOption, ReferendumOption> referendumOptionFuerWahlvorschlagReferenz = new HashMap<>();

  private final Wahldurchfuehrung wahldurchfuehrung;

  private final GebietMapper gebietMapper;

  public WasStimmeingabeXMLImportMapperMaps(GebietMapper gebietMapper,
                                            GruppeImGebietFactory gruppeImGebietFactory, GruppeFactory gruppeFactory,
                                            ListenkandidaturFactory listenkandidaturFactory, Wahldurchfuehrung wahldurchfuehrung) {
    this.gebietMapper = gebietMapper;
    this.gruppeImGebietFactory = gruppeImGebietFactory;
    this.gruppeFactory = gruppeFactory;
    this.listenkandidaturFactory = listenkandidaturFactory;
    this.wahldurchfuehrung = wahldurchfuehrung;
  }

  public Wahldurchfuehrungsgebiet getGebietFuerReferenz(GebietReferenz gebietReferenz) {
    return gebietMapper.getGebietFuerReferenz(gebietReferenz, wahldurchfuehrungsgebietFuerReferenz, wahldurchfuehrung);
  }

  public Gruppe getGruppeFuerReferenz(GruppeReferenz gruppeReferenz) {
    if (gruppeReferenz == null) {
      return null;
    }
    Gruppe result = gruppeFuerReferenz.get(gruppeReferenz);
    if (result == null) {
      result = gruppeFactory.create();
      result.setSchluessel(gruppeReferenz.getSchluessel());
      result.setWahl(wahldurchfuehrung);
      gruppeFuerReferenz.put(gruppeReferenz, result);
    }

    return result;

  }

  public GruppeImGebiet getGruppeImGebietFuerReferenz(GruppeImGebietReferenz gruppeImGebietReferenz) {
    if (gruppeImGebietReferenz == null) {
      return null;
    }

    GruppeImGebiet result = gruppeImGebietFuerReferenz.get(gruppeImGebietReferenz);

    if (result == null) {
      result = gruppeImGebietFactory.create();
      result.setGebiet(getGebietFuerReferenz(gruppeImGebietReferenz.getGebiet()));
      result.setGruppe(getGruppeFuerReferenz(gruppeImGebietReferenz.getGruppe()));
      gruppeImGebietFuerReferenz.put(gruppeImGebietReferenz, result);
    }

    return result;

  }

  public Listenkandidatur getListenkandidaturFuerReferenz(KandidaturReferenz listenkandidaturKandidaturReferenz) {
    if (listenkandidaturKandidaturReferenz == null) {
      return null;
    }
    Listenkandidatur result = listenkandidaturFuerKandidaturReferenz.get(listenkandidaturKandidaturReferenz);
    if (result == null) {

      result = listenkandidaturFactory.create();
      result.setRelativePosition(listenkandidaturKandidaturReferenz.getListenposition());
      Liste liste = new Liste();
      result.setListe(liste);
      liste.setGruppeImGebiet(getGruppeImGebietFuerReferenz(listenkandidaturKandidaturReferenz
          .getGruppeImGebietReferenz()));
      result.setWahl(wahldurchfuehrung);
      listenkandidaturFuerKandidaturReferenz.put(listenkandidaturKandidaturReferenz, result);
    }

    return result;
  }

  public ReferendumOption getReferendumOptionFuerReferenz(de.ivu.elect.interfaces.core.ReferendumOption referendumOption) {
    if (referendumOption == null) {
      return null;
    }

    ReferendumOption result = referendumOptionFuerWahlvorschlagReferenz.get(referendumOption);
    if (result == null) {
      result = new ReferendumOption();
      result.setPosition(referendumOption.getPosition());
      result.setGruppeImGebiet(getGruppeImGebietFuerReferenz(referendumOption.getWahlvorschlagReferenz().getGruppeImGebietReferenz()));
      referendumOptionFuerWahlvorschlagReferenz.put(referendumOption, result);
    }

    return result;
  }
}
