
package de.ivu.elect.wus.exchange.wahlrechtspruefung.mapper;

import java.util.Map;

import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlrechtspruefung.entity.Pruefkriterium;
import de.ivu.elect.business.wahlrechtspruefung.entity.PruefkriteriumBezug;
import de.ivu.elect.business.wahlrechtspruefung.entity.WahlrechtspruefStatus;
import de.ivu.elect.business.wahlrechtspruefung.entity.Wahlrechtspruefung;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.core.exchange.mapper.WahlInternExternMapperUtil;
import de.ivu.elect.exchange.EntityMapper;
import de.ivu.elect.interfaces.core.KandidaturReferenz;
import de.ivu.elect.interfaces.core.WahlvorschlagReferenz;
import de.ivu.elect.interfaces.core.zulassungspruefung.PruefkriteriumReferenz;

public class ZulassungspruefungMapper {

  @Inject
  private transient WahlInternExternMapperUtil wahlInternExternMapperUtil;

  public ZulassungspruefungMapper() {
    super();
  }

  public de.ivu.elect.interfaces.core.zulassungspruefung.Wahlrechtspruefung extern(Wahlrechtspruefung intern) {
    de.ivu.elect.interfaces.core.zulassungspruefung.Wahlrechtspruefung extern = new de.ivu.elect.interfaces.core.zulassungspruefung.Wahlrechtspruefung();

    extern.setBemerkung(intern.getBemerkung());
    extern.setFristInTagenBisZurWahl(intern.getFristInTagenBisZurWahl());
    extern.setKandidaturReferenz(referenzExtern(intern.getKandidatur()));
    extern.setPruefkriteriumReferenz(referenzExtern(intern.getPruefkriterium()));
    extern.setWahlrechtspruefStatus(valueExtern(intern.getWahlrechtspruefStatus()));
    extern.setWahlvorschlagReferenz(referenzExtern(intern.getWahlvorschlag()));

    return extern;
  }

  public Wahlrechtspruefung intern(de.ivu.elect.interfaces.core.zulassungspruefung.Wahlrechtspruefung extern, Map<PruefkriteriumReferenz, Pruefkriterium> pruefkriteriumInternPerReferenzExtern,
      Map<WahlvorschlagReferenz, Wahlvorschlag> wahlvorschlagInternPerReferenzExtern, Map<KandidaturReferenz, Kandidatur> kandidaturInternPerKandidaturReferenzExtern) {
    Wahlrechtspruefung intern = new Wahlrechtspruefung();

    intern.setBemerkung(extern.getBemerkung());
    intern.setFristInTagenBisZurWahl(extern.getFristInTagenBisZurWahl());
    intern.setKandidatur(referenzIntern(extern.getKandidaturReferenz(), kandidaturInternPerKandidaturReferenzExtern));
    intern.setPruefkriterium(referenzIntern(extern.getPruefkriteriumReferenz(), pruefkriteriumInternPerReferenzExtern));
    intern.setWahlrechtspruefStatus(valueIntern(extern.getWahlrechtspruefStatus()));
    intern.setWahlvorschlag(referenzIntern(extern.getWahlvorschlagReferenz(), wahlvorschlagInternPerReferenzExtern));

    return intern;
  }

  public de.ivu.elect.interfaces.core.zulassungspruefung.Pruefkriterium extern(Pruefkriterium intern) {
    de.ivu.elect.interfaces.core.zulassungspruefung.Pruefkriterium extern = new de.ivu.elect.interfaces.core.zulassungspruefung.Pruefkriterium();

    extern.setPruefkriteriumReferenz(referenzExtern(intern));
    extern.setFristInTagenBisZurWahl(intern.getFristInTagenBisZurWahl());
    extern.setHeilungsfaehig(intern.getHeilungsfaehig());
    extern.setKannIrrelevantSein(intern.getKannIrrelevantSein());
    extern.setKategorie(intern.getKategorie());
    extern.setKriteriumtext(intern.getKriteriumtext());
    extern.setPosition(intern.getPosition());
    extern.setPruefkriteriumBezug(valueExtern(intern.getPruefkriteriumBezug()));
    extern.setTeilDerSofortpruefung(intern.getTeilDerSofortpruefung());
    extern.setTextFuerProtokollErfuellt(intern.getTextFuerProtokollErfuellt());
    extern.setTextFuerProtokollFrist(intern.getTextFuerProtokollFrist());
    extern.setTextFuerProtokollNichtErfuellt(intern.getTextFuerProtokollNichtErfuellt());
    extern.setUnterkategorie(intern.getUnterkategorie());
    extern.setWahlrechtlichRelevant(intern.getWahlrechtlichRelevant());

    return extern;
  }

  public Pruefkriterium intern(de.ivu.elect.interfaces.core.zulassungspruefung.Pruefkriterium extern) {
    Pruefkriterium intern = new Pruefkriterium();

    intern.setFristInTagenBisZurWahl(extern.getFristInTagenBisZurWahl());
    intern.setHeilungsfaehig(Boolean.TRUE.equals(extern.getHeilungsfaehig()));
    intern.setKannIrrelevantSein(Boolean.TRUE.equals(extern.getKannIrrelevantSein()));
    intern.setKategorie(extern.getKategorie());
    intern.setKriteriumtext(extern.getKriteriumtext());
    intern.setPosition(extern.getPosition());
    intern.setPruefkriteriumBezug(valueIntern(extern.getPruefkriteriumBezug()));
    intern.setTeilDerSofortpruefung(Boolean.TRUE.equals(extern.getTeilDerSofortpruefung()));
    intern.setTextFuerProtokollErfuellt(extern.getTextFuerProtokollErfuellt());
    intern.setTextFuerProtokollFrist(extern.getTextFuerProtokollFrist());
    intern.setTextFuerProtokollNichtErfuellt(extern.getTextFuerProtokollNichtErfuellt());
    intern.setUnterkategorie(extern.getUnterkategorie());
    intern.setWahlrechtlichRelevant(Boolean.TRUE.equals(extern.getWahlrechtlichRelevant()));

    return intern;
  }

  protected de.ivu.elect.interfaces.core.zulassungspruefung.WahlrechtspruefStatus valueExtern(WahlrechtspruefStatus intern) {
    return de.ivu.elect.interfaces.core.zulassungspruefung.WahlrechtspruefStatus.valueOf(intern.name());
  }

  protected WahlrechtspruefStatus valueIntern(de.ivu.elect.interfaces.core.zulassungspruefung.WahlrechtspruefStatus extern) {
    return WahlrechtspruefStatus.valueOf(extern.name());
  }

  protected de.ivu.elect.interfaces.core.zulassungspruefung.PruefkriteriumBezug valueExtern(PruefkriteriumBezug intern) {
    return de.ivu.elect.interfaces.core.zulassungspruefung.PruefkriteriumBezug.valueOf(intern.name());
  }

  protected PruefkriteriumBezug valueIntern(de.ivu.elect.interfaces.core.zulassungspruefung.PruefkriteriumBezug extern) {
    return PruefkriteriumBezug.valueOf(extern.name());
  }

  private KandidaturReferenz referenzExtern(Kandidatur intern) {
    return wahlInternExternMapperUtil.mappeKandidaturZuReferenz(intern);
  }

  private Kandidatur referenzIntern(KandidaturReferenz extern, Map<KandidaturReferenz, Kandidatur> kandidaturInternPerKandidaturReferenzExtern) {
    if (extern == null) {
      return null;
    }

    return kandidaturInternPerKandidaturReferenzExtern.get(extern);
  }

  private PruefkriteriumReferenz referenzExtern(Pruefkriterium intern) {
    PruefkriteriumReferenz pruefkriteriumReferenz = new PruefkriteriumReferenz();
    pruefkriteriumReferenz.setId(EntityMapper.createIdInDatei(intern));

    return pruefkriteriumReferenz;
  }

  private Pruefkriterium referenzIntern(PruefkriteriumReferenz extern, Map<PruefkriteriumReferenz, Pruefkriterium> pruefkriteriumInternPerReferenzExtern) {
    Pruefkriterium intern = pruefkriteriumInternPerReferenzExtern.get(extern);

    if (intern == null) {
      throw new IllegalStateException("Pruefkriterium referenziert, aber nicht in Datei enthalten: " + extern);
    }

    return intern;
  }

  private WahlvorschlagReferenz referenzExtern(Wahlvorschlag intern) {
    return wahlInternExternMapperUtil.mappeWahlvorschlagReferenz(intern);
  }

  private Wahlvorschlag referenzIntern(WahlvorschlagReferenz extern, Map<WahlvorschlagReferenz, Wahlvorschlag> wahlvorschlagInternPerReferenzExtern) {
    Wahlvorschlag intern = wahlvorschlagInternPerReferenzExtern.get(extern);

    if (intern == null) {
      throw new IllegalStateException("Wahlvorschlag referenziert, aber nicht in Datei enthalten: " + extern);
    }

    return intern;
  }
}
