
package de.ivu.elect.wvp.exchange.mapper;

import java.util.Map;

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

import de.ivu.elect.business.kandidatenportal.entity.WvpWarnung;
import de.ivu.elect.business.kandidatenportal.entity.WvpWarnungKategorie;
import de.ivu.elect.business.kandidatenportal.entity.WvpWarnungStatus;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.core.exchange.mapper.WahlInternExternMapperUtil;
import de.ivu.elect.interfaces.core.KandidaturReferenz;
import de.ivu.elect.interfaces.core.PersonReferenz;
import de.ivu.elect.interfaces.core.WahlvorschlagReferenz;

public class KandidatenportalMapper {

  @Inject
  private transient WahlInternExternMapperUtil wahlInternExternMapperUtil;

  public KandidatenportalMapper() {
    super();
  }

  public de.ivu.elect.interfaces.wvp.WvpWarnung extern(WvpWarnung intern) {
    de.ivu.elect.interfaces.wvp.WvpWarnung extern = new de.ivu.elect.interfaces.wvp.WvpWarnung();

    extern.setText(intern.getText());
    extern.setKandidaturReferenz(referenzExtern(intern.getKandidatur()));
    extern.setWahlvorschlagReferenz(referenzExtern(intern.getWahlvorschlag()));
    extern.setWahlvorschlagsPersonReferenz(referenzExtern(intern.getWahlvorschlagsPerson()));
    extern.setWvpWarnungKategorie(valueExtern(intern.getWvpWarnungKategorie()));
    extern.setWvpWarnungStatus(valueExtern(intern.getWvpWarnungStatus()));

    return extern;
  }

  public WvpWarnung intern(de.ivu.elect.interfaces.wvp.WvpWarnung extern, Map<WahlvorschlagReferenz, Wahlvorschlag> wahlvorschlagInternPerReferenzExtern,
      Map<KandidaturReferenz, Kandidatur> kandidaturInternPerKandidaturReferenzExtern, Map<PersonReferenz, WahlvorschlagsPerson> wahlvorschlagsPersonInternPerReferenzExtern) {
    WvpWarnung intern = new WvpWarnung();

    intern.setText(extern.getText());
    intern.setKandidatur(referenzIntern(extern.getKandidaturReferenz(), kandidaturInternPerKandidaturReferenzExtern));
    intern.setWahlvorschlag(referenzIntern(extern.getWahlvorschlagReferenz(), wahlvorschlagInternPerReferenzExtern));
    intern.setWahlvorschlagsPerson(referenzIntern(extern.getWahlvorschlagsPersonReferenz(), wahlvorschlagsPersonInternPerReferenzExtern));
    intern.setWvpWarnungKategorie(valueIntern(extern.getWvpWarnungKategorie()));
    intern.setWvpWarnungStatus(valueIntern(extern.getWvpWarnungStatus()));

    return intern;
  }

  protected de.ivu.elect.interfaces.wvp.WvpWarnungStatus valueExtern(WvpWarnungStatus intern) {
    return de.ivu.elect.interfaces.wvp.WvpWarnungStatus.valueOf(intern.name());
  }

  protected WvpWarnungStatus valueIntern(de.ivu.elect.interfaces.wvp.WvpWarnungStatus extern) {
    return WvpWarnungStatus.valueOf(extern.name());
  }

  protected de.ivu.elect.interfaces.wvp.WvpWarnungKategorie valueExtern(WvpWarnungKategorie intern) {
    return de.ivu.elect.interfaces.wvp.WvpWarnungKategorie.valueOf(intern.name());
  }

  protected WvpWarnungKategorie valueIntern(de.ivu.elect.interfaces.wvp.WvpWarnungKategorie extern) {
    return WvpWarnungKategorie.valueOf(extern.name());
  }

  private KandidaturReferenz referenzExtern(@Nullable Kandidatur intern) {
    if (intern == null) {
      return null;
    }

    return wahlInternExternMapperUtil.mappeKandidaturZuReferenz(intern);
  }

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

    return kandidaturInternPerKandidaturReferenzExtern.get(extern);
  }

  private WahlvorschlagReferenz referenzExtern(@Nullable Wahlvorschlag intern) {
    if (intern == null) {
      return null;
    }

    return wahlInternExternMapperUtil.mappeWahlvorschlagReferenz(intern);
  }

  private Wahlvorschlag referenzIntern(@Nullable WahlvorschlagReferenz extern, Map<WahlvorschlagReferenz, Wahlvorschlag> wahlvorschlagInternPerReferenzExtern) {
    if (extern == null) {
      return null;
    }

    return wahlvorschlagInternPerReferenzExtern.get(extern);
  }

  private PersonReferenz referenzExtern(@Nullable WahlvorschlagsPerson intern) {
    if (intern == null) {
      return null;
    }

    return wahlInternExternMapperUtil.mappePersonendatenZuReferenz(intern);
  }

  @Nullable
  private WahlvorschlagsPerson referenzIntern(@Nullable PersonReferenz extern, Map<PersonReferenz, WahlvorschlagsPerson> wahlvorschlagsPersonInternPerReferenzExtern) {
    if (extern == null) {
      return null;
    }

    return wahlvorschlagsPersonInternPerReferenzExtern.get(extern);
  }
}
