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

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.core.exchange.mapper.WahlInternExternMapperUtil;
import de.ivu.elect.interfaces.core.GebietReferenz;
import de.ivu.elect.interfaces.core.GruppeImGebietReferenz;
import de.ivu.elect.interfaces.core.KandidaturReferenz;
import de.ivu.elect.interfaces.core.ReferendumOption;

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

  private final WahlInternExternMapperUtil wahlInternExternMapperUtil;

  private final Map<Gebiet, GebietReferenz> gebietReferenzFuerGebiet;

  private final Map<GruppeImGebiet, GruppeImGebietReferenz> gruppeImGebietReferenzFuerGruppeImGebiet;

  private final Map<Kandidatur, KandidaturReferenz> kandidaturReferenzFuerKandidatur;

  private final Map<de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption, ReferendumOption> referendumMap;

  public WasStimmeingabeXMLExportMapperMaps(WahlInternExternMapperUtil wahlInternExternMapperUtil) {
    super();

    this.wahlInternExternMapperUtil = wahlInternExternMapperUtil;

    this.gebietReferenzFuerGebiet = new HashMap<>();
    this.gruppeImGebietReferenzFuerGruppeImGebiet = new HashMap<>();
    this.kandidaturReferenzFuerKandidatur = new HashMap<>();
    this.referendumMap = new HashMap<>();
  }

  public GebietReferenz getGebietReferenzFuerGebiet(Gebiet gebiet) {
    if (gebiet == null) {
      return null;
    }

    GebietReferenz result = gebietReferenzFuerGebiet.get(gebiet);

    if (result == null) {
      result = wahlInternExternMapperUtil.createGebietReferenz(gebiet);

      gebietReferenzFuerGebiet.put(gebiet, result);
    }

    return result;
  }

  public GruppeImGebietReferenz getGruppeImGebietReferenzFuerGruppeImGebiet(GruppeImGebiet gruppeImGebiet) {
    if (gruppeImGebiet == null) {
      return null;
    }

    GruppeImGebietReferenz result = gruppeImGebietReferenzFuerGruppeImGebiet.get(gruppeImGebiet);

    if (result == null) {
      result = wahlInternExternMapperUtil.createGruppeImGebietReferenz(gruppeImGebiet);

      gruppeImGebietReferenzFuerGruppeImGebiet.put(gruppeImGebiet, result);
    }

    return result;
  }

  public KandidaturReferenz getKandidaturReferenzFuerKandidatur(Listenkandidatur listenkandidatur) {
    if (listenkandidatur == null) {
      return null;
    }

    KandidaturReferenz result = kandidaturReferenzFuerKandidatur.get(listenkandidatur);

    if (result == null) {
      result = wahlInternExternMapperUtil.mappeKandidaturZuReferenz(listenkandidatur);

      kandidaturReferenzFuerKandidatur.put(listenkandidatur, result);
    }

    return result;
  }

  public ReferendumOption getRefrendumOption(de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption referendumOption) {
    if (referendumOption == null) {
      return null;
    }

    ReferendumOption result = referendumMap.get(referendumOption);

    if (result == null) {
      result = wahlInternExternMapperUtil.mappeReferendum(referendumOption);

      referendumMap.put(referendumOption, result);
    }

    return result;
  }
}
