
package de.ivu.elect.was.exchange;

import java.io.Serializable;
import java.util.Map;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietFactory;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.core.exchange.mapper.WahlInternExternMapperUtil;
import de.ivu.elect.interfaces.core.GebietReferenz;

public class GebietMapper implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlInternExternMapperUtil wahlInternExternMapperUtil;

  @Inject
  private transient WahldurchfuehrungsgebietFactory wahldurchfuehrungsgebietFactory;

  public GebietMapper() {
    super();
  }

  @Nullable
  public Wahldurchfuehrungsgebiet getGebietFuerReferenz(GebietReferenz gebietReferenz, Map<GebietReferenz, Wahldurchfuehrungsgebiet> wahldurchfuehrungsgebietFuerReferenz,
      Wahldurchfuehrung wahldurchfuehrung) {
    if (gebietReferenz == null) {
      return null;
    }

    Wahldurchfuehrungsgebiet result = wahldurchfuehrungsgebietFuerReferenz.get(gebietReferenz);

    if (result == null) {
      Gebietsart gebietsart = new Gebietsart();
      gebietsart.setName(gebietReferenz.getGebietsart());

      result = wahldurchfuehrungsgebietFactory.create();
      result.setNummer(gebietReferenz.getNummer());
      result.setGebietsart(gebietsart);
      result.setWahl(wahldurchfuehrung);

      wahldurchfuehrungsgebietFuerReferenz.put(gebietReferenz, result);
    }

    return result;
  }

  @Nullable
  public GebietReferenz getGebietReferenzFuerGebiet(Gebiet gebiet, Map<Gebiet, GebietReferenz> gebietReferenzFuerGebiet) {
    if (gebiet == null) {
      return null;
    }

    GebietReferenz result = gebietReferenzFuerGebiet.get(gebiet);

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

      gebietReferenzFuerGebiet.put(gebiet, result);
    }

    return result;
  }
}
