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

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsherkunft;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehler;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehlerart;
import de.ivu.elect.business.stimmeingabe.entity.ZwischensummeEingabe;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.core.exchange.mapper.WahlInternExternMapperUtil;
import de.ivu.elect.interfaces.was.stimmeingabe.ErfassteStimmen;
import de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingabestufe;
import de.ivu.elect.interfaces.was.stimmeingabe.GeloeschterErgebniseingang;
import de.ivu.elect.interfaces.was.stimmeingabe.Stimmeneingabefehler;

public abstract class AbstractWasEingabeXMLExportMapper {

  @Inject
  protected transient WahlInternExternMapperUtil wahlInternExternMapperUtil;

  @Inject
  protected transient StimmeingabePlausiMapper stimmeingabePlausiMapper;

  public AbstractWasEingabeXMLExportMapper() {
    super();
  }

  protected void mappeWahl(ErfassteStimmen erfassteStimmen, Ergebniseingang ergebniseingang) {
    Wahl wahl = ergebniseingang.getWahldurchfuehrungsgebiet().getWahl();
    erfassteStimmen.setWahlart(wahl.getWahlart().getName());
    erfassteStimmen.setWahldatum(wahl.getWahltermin().getWahldatum());
    erfassteStimmen.setWahlterminNummer(wahl.getWahltermin().getNummer());
    erfassteStimmen.setWahlname(wahl.getName());
  }

  public de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingang mappe(Ergebniseingang ergebniseingang, WasStimmeingabeXMLExportMapperMaps maps) {
    de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingang result = new de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingang();

    result.setEingangssequenznummer(ergebniseingang.getEingangssequenznummer());
    result.setErfasser(ergebniseingang.getErfasser());
    result.setErgebniseingangsart(mappe(ergebniseingang.getErgebniseingangsart()));
    result.setErgebniseingabestufe(mappe(ergebniseingang.getErgebniseingabestufe()));
    result.setErgebniseingangsfehlerstatus(mappe(ergebniseingang.getErgebniseingangsfehlerstatus()));
    result.setErgebniseingangsherkunft(mappe(ergebniseingang.getErgebniseingangsherkunft()));
    result.setGebiet(maps.getGebietReferenzFuerGebiet(ergebniseingang.getWahldurchfuehrungsgebiet()));
    result.setZeitstempel(ergebniseingang.getZeitstempel());

    for (Stimmeingabe stimmeingabe : ergebniseingang.getStimmeingaben()) {
      if (stimmeingabe.isZwischensummeEingabe()) {
        result.getZwischensummeEingaben().add(mappe((ZwischensummeEingabe) stimmeingabe, maps));
      } else {
        result.getStimmeingaben().add(mappe(stimmeingabe, maps));
      }
    }

    return result;
  }

  public GeloeschterErgebniseingang mappeGeloescht(Ergebniseingang ergebniseingang, WasStimmeingabeXMLExportMapperMaps maps) {
    GeloeschterErgebniseingang result = new GeloeschterErgebniseingang();
    result.setEingangssequenznummer(ergebniseingang.getEingangssequenznummer());
    result.setGebiet(maps.getGebietReferenzFuerGebiet(ergebniseingang.getWahldurchfuehrungsgebiet()));
    result.setErgebniseingangsart(mappe(ergebniseingang.getErgebniseingangsart()));

    if (ergebniseingang.getWahldurchfuehrungsgebiet().getErfasstIn() != null) {
      result.setErfasstIn(maps.getGebietReferenzFuerGebiet(ergebniseingang.getWahldurchfuehrungsgebiet().getErfasstIn()));
    }

    return result;
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.Stimmeingabe mappe(Stimmeingabe stimmeingabe, WasStimmeingabeXMLExportMapperMaps maps) {
    de.ivu.elect.interfaces.was.stimmeingabe.Stimmeingabe result = new de.ivu.elect.interfaces.was.stimmeingabe.Stimmeingabe();
    mappeStimmeingabedaten(result, stimmeingabe, maps);
    return result;

  }

  protected void mappeStimmeingabedaten(de.ivu.elect.interfaces.was.stimmeingabe.Stimmeingabe result, Stimmeingabe stimmeingabe, WasStimmeingabeXMLExportMapperMaps maps) {
    result.setAnzahlEingabe(stimmeingabe.getAnzahlEingabe());
    result.setStimmenart(mappe(stimmeingabe.getStimmenart()));
    result.setGruppeImGebietReferenz(maps.getGruppeImGebietReferenzFuerGruppeImGebiet(stimmeingabe.getGruppeImGebiet()));
    result.setListenkandidatur(maps.getKandidaturReferenzFuerKandidatur(stimmeingabe.getListenkandidatur()));
    result.setReferendumOption(maps.getRefrendumOption(stimmeingabe.getReferendumOption()));
    for (Stimmeingabefehler stimmeingabefehler : stimmeingabe.getStimmeingabefehlersByStimmeingabe()) {
      result.getStimmeneingabefehlerListe().add(mappe(stimmeingabefehler));
    }
  }

  protected Stimmeneingabefehler mappe(Stimmeingabefehler stimmeingabefehler) {
    Stimmeneingabefehler result = new Stimmeneingabefehler();
    result.setBeschreibung(stimmeingabefehler.getBeschreibung());
    result.setFehlerart(mappe(stimmeingabefehler.getFehlerart()));
    result.setStimmeingabePlausiTyp(stimmeingabePlausiMapper.mappe(stimmeingabefehler.getStimmeingabePlausiTyp()));
    result.setErwarteteAnzahlEingabe(stimmeingabefehler.getErwarteteAnzahlEingabe());
    return result;
  }

  protected de.ivu.elect.interfaces.core.Stimmenart mappe(Stimmenart stimmenart) {
    return wahlInternExternMapperUtil.mappeStimmenart(stimmenart);
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.ZwischensummeEingabe mappe(ZwischensummeEingabe stimmeingabe, WasStimmeingabeXMLExportMapperMaps maps) {
    de.ivu.elect.interfaces.was.stimmeingabe.ZwischensummeEingabe result = new de.ivu.elect.interfaces.was.stimmeingabe.ZwischensummeEingabe();
    mappeStimmeingabedaten(result, stimmeingabe, maps);
    result.setSummenIndex(stimmeingabe.getSummenIndex());
    result.setSummenName(stimmeingabe.getSummenName());
    return result;
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.Stimmeingabefehlerart mappe(Stimmeingabefehlerart fehlerart) {
    return de.ivu.elect.interfaces.was.stimmeingabe.Stimmeingabefehlerart.valueOf(fehlerart.name());
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingangsherkunft mappe(Ergebniseingangsherkunft ergebniseingangsherkunft) {
    return de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingangsherkunft.valueOf(ergebniseingangsherkunft.name());
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingabestufe mappe(de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe ergebniseingabestufe) {
    if (ergebniseingabestufe == null) {
      return Ergebniseingabestufe.ENDSTUFE;
    }

    return de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingabestufe.valueOf(ergebniseingabestufe.name());
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingangsfehlerstatus mappe(de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsfehlerstatus ergebniseingangsfehlerstatus) {
    return de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingangsfehlerstatus.valueOf(ergebniseingangsfehlerstatus.name());
  }

  protected de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingangsart mappe(Ergebniseingangsart ergebniseingangsart) {
    return de.ivu.elect.interfaces.was.stimmeingabe.Ergebniseingangsart.valueOf(ergebniseingangsart.name());
  }
}
