
package de.ivu.elect.was.exchange.wahl.mapper;

import java.util.List;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.ergebnis.control.StimmergebnisDaten;
import de.ivu.elect.business.wahl.control.Wahldaten;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.core.exchange.mapper.WahlInternExternMapper;
import de.ivu.elect.interfaces.core.Gebiet;
import de.ivu.elect.interfaces.core.Wahl;
import de.ivu.elect.interfaces.was.wahlbeteiligung.WahlbeteiligungExchange;
import de.ivu.elect.was.exchange.gebietsbaum.mapper.WasGebietMapper;
import de.ivu.elect.was.exchange.wahlbeteiligung.mapper.WasWahlbeteiligungMapper;

@Specializes
public class WasWahlInternExternMapper extends WahlInternExternMapper {

  @Inject
  private transient WasWahlbeteiligungMapper wasWahlbeteiligungMapper;

  @Inject
  private transient WasHelperMapper wasHelperMapper;

  public WasWahlInternExternMapper() {
    super();
  }

  @Override
  public Wahl mappe(Wahldaten wahldatenIntern, List<DokumentVorlage> dokumentVorlagen, List<WahlParameter> wahlParameters) {
    Wahl wahlExtern = super.mappe(wahldatenIntern, dokumentVorlagen, wahlParameters);
    de.ivu.elect.interfaces.core.Wahldurchfuehrung wahldurchfuehrungExtern = new de.ivu.elect.interfaces.core.Wahldurchfuehrung();
    wahlExtern.setWahldurchfuehrung(wahldurchfuehrungExtern);

    Wahldurchfuehrung wahldurchfuehrung = wahldatenIntern.getWahl().castTo(Wahldurchfuehrung.class).getEntity();

    wahldurchfuehrungExtern.setSitzberechnungsalgorithmus(wahldurchfuehrung.getSitzberechnungsalgorithmus().name());
    wahldurchfuehrungExtern.setTextFuerPraesentation("");
    wahldurchfuehrungExtern.setErgebniseingangsart(wasHelperMapper.mappe(wahldurchfuehrung.getErgebniseingangsart()));

    return wahlExtern;
  }

  @Override
  protected WahlbeteiligungExchange mappeWahlbeteiligung(Wahldaten wahldatenIntern) {
    WahlbeteiligungExchange result = super.mappeWahlbeteiligung(wahldatenIntern);

    if (wahldatenIntern instanceof StimmergebnisDaten) {
      WahlbeteiligungExchange wahlbeteiligungExchange = wasWahlbeteiligungMapper.mappeAuswertungen(((StimmergebnisDaten) wahldatenIntern).getWahlbeteiligungAuswertungen());
      result.getWahlbeteiligungAuswertungen().addAll(wahlbeteiligungExchange.getWahlbeteiligungAuswertungen());
      result.getErfassteWahlbeteiligungen().addAll(wahlbeteiligungExchange.getErfassteWahlbeteiligungen());
    }

    return result;
  }

  @Override
  protected Gebiet mappeGebiet(de.ivu.elect.business.gebietsbaum.entity.Gebiet gebietIntern, Wahldaten wahldatenIntern) {
    return ((WasGebietMapper) gebietMapper).mappe(gebietIntern, wahldatenIntern);
  }
}
