
package de.ivu.elect.wus.exchange.wahlvorschlag.csv;

import static java.util.stream.Collectors.toList;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.anschrift.entity.AnschriftArt;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.gruppe.entity.GruppeArt;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.kandidatur.control.WahlvorschlagImportContext;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.mandant.entity.Mandant;

public class WahlvorschlagCsvExternInternMapper extends AbstractWahlvorschlagCsvExternInternMapper<DefaultWahlvorschlagCsvDTO> {

  public WahlvorschlagCsvExternInternMapper() {
    super();
  }

  @Override
  protected String mapToGebietsart(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv, WahlvorschlagImportContext context) {
    return wahlvorschlagCsv.getGebietsart();
  }

  @Override
  protected String mapToGruppeSchluessel(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv, Mandant mandant) {
    return wahlvorschlagCsv.getGruppeSchluessel();
  }

  @Override
  protected void fillPositionenWahlvorschlag(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv, GruppeImGebiet gruppeImGebiet) {
    super.fillPositionenWahlvorschlag(wahlvorschlagCsv, gruppeImGebiet);

    gruppeImGebiet.setRelativePosition(wahlvorschlagCsv.getWahlvorschlagPositionRelativ());
    gruppeImGebiet.setVorgegebenePosition(wahlvorschlagCsv.getWahlvorschlagPositionVorgegeben());
    gruppeImGebiet.setEingereichtePosition(wahlvorschlagCsv.getWahlvorschlagPositionEingereicht());

    if (gruppeImGebiet.getRelativePosition() == null) {
      // ELECT-6957 fallback

      gruppeImGebiet.setRelativePosition(wahlvorschlagCsv.getWahlvorschlagPosition());
    }
  }

  @Override
  protected void fillKandidatur(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv, Kandidatur kandidatur, WahlvorschlagImportContext context, DublettenVerarbeitungsAnweisung dublettenVerarbeitung)
      throws MappingException {
    super.fillKandidatur(wahlvorschlagCsv, kandidatur, context, dublettenVerarbeitung);

    kandidatur.setGeburtsort(wahlvorschlagCsv.getKandidaturGeburtsort()); // ELECT-12274

    kandidatur.setAkademischerGradUnformatiert(wahlvorschlagCsv.getKandidaturAkademischerGrad());

    kandidatur.setGeschlecht(wahlvorschlagCsv.getKandidaturGeschlecht());

    kandidatur.setEhrenamtUnformatiert(wahlvorschlagCsv.getKandidaturEhrenamt());
    kandidatur.setKuenstlername(wahlvorschlagCsv.getKandidaturKuenstlername());
    kandidatur.setOrdensname(wahlvorschlagCsv.getKandidaturOrdensname());

    kandidatur.setBerufsschluessel(wahlvorschlagCsv.getKandidaturBerufsschluessel());

    kandidatur.setStaatsangehoerigkeitenSorted(wahlvorschlagCsv.getKandidaturStaatsangehoerigkeiten().stream().map(this::mapToStaatsangehoerigkeit).collect(toList()));

    fillAnschrift(wahlvorschlagCsv, kandidatur.getAnschrift());
    fillErreichbarkeitsanschrift(wahlvorschlagCsv, kandidatur.getErreichbarkeitsanschrift());

    fillDublette(wahlvorschlagCsv, kandidatur, context, dublettenVerarbeitung);
  }

  @Override
  protected GruppeArt mapToGruppeArt(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv) {
    if (wahlvorschlagCsv.isEinzelbewerber()) {
      return GruppeArt.EINZELBEWERBER;
    }

    return GruppeArt.PARTEI;
  }

  protected void fillAnschrift(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv, Anschrift anschrift) {
    anschrift.setStrasse(wahlvorschlagCsv.getKandidaturAnschriftStrasse());
    anschrift.setHausnummer(wahlvorschlagCsv.getKandidaturAnschriftHausnummer());
    anschrift.setHausnummerzusatz(wahlvorschlagCsv.getKandidaturAnschriftHausnummerzusatz());
    anschrift.setWohnungsnummer(wahlvorschlagCsv.getKandidaturAnschriftWohnungsnummer());

    anschrift.setPlz(wahlvorschlagCsv.getKandidaturAnschriftPLZ());
    anschrift.setOrt(wahlvorschlagCsv.getKandidaturAnschriftOrt());
    anschrift.setOrtsteil(wahlvorschlagCsv.getKandidaturAnschriftOrtsteil());

    anschrift.setZustellanweisung(wahlvorschlagCsv.getKandidaturAnschriftZustellanweisung());
    if (wahlvorschlagCsv.hasKandidaturAnschriftArt()) {
      anschrift.setAnschriftArt(AnschriftArt.valueOf(wahlvorschlagCsv.getKandidaturAnschriftArt()));
    }
  }

  protected void fillErreichbarkeitsanschrift(DefaultWahlvorschlagCsvDTO wahlvorschlagCsv, Anschrift anschrift) {
    anschrift.setStrasse(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftStrasse());
    anschrift.setHausnummer(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftHausnummer());
    anschrift.setHausnummerzusatz(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftHausnummerzusatz());
    anschrift.setWohnungsnummer(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftWohnungsnummer());

    anschrift.setPlz(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftPLZ());
    anschrift.setOrt(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftOrt());
    anschrift.setOrtsteil(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftOrtsteil());

    anschrift.setZustellanweisung(wahlvorschlagCsv.getKandidaturErreichbarkeitsanschriftZustellanweisung());
  }
}
