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

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.jsefa.CsvHeader;
import org.jsefa.csv.annotation.CsvDataType;
import org.jsefa.csv.annotation.CsvField;

import javax.annotation.Nullable;
import java.util.Date;
import java.util.Locale;

// ELECT-2953 (WUS: Wahlvorschlagsimport fürs Produkt erstellen)
@CsvDataType
public class DefaultWahlvorschlagCsvDTO extends AbstractAbstractWahlvorschlagCsvDTO {

  public static final String GEBURTSDATUM_FORMAT_LONG = "dd.MM.yyyy";

  /** Für Stimmzettel wird oft nur die Jahreszahl des Geburtsdatums von Kandidaten angegeben. */
  public static final String GEBURTSDATUM_FORMAT_SHORT = "yyyy";
  public static final String FILE_FORMAT_NAME = "file.format.wahlvorschlaege.default";
  public static final FileFormat FILE_FORMAT = new FileFormat(FILE_FORMAT_NAME, FileType.CSV);

  @CsvField(pos = 1, required = true)
  @CsvHeader("Gebietsart")
  String gebietsart;

  @CsvField(pos = 2, required = true)
  @CsvHeader("Gebietsnummer")
  String gebietsnummer;

  /** Nicht benötigt bei Einzelkandidaten */
  @CsvField(pos = 3, required = false)
  @CsvHeader("Gruppe-Schluessel")
  String gruppeSchluessel;

  @Deprecated // ELECT-6957
  @CsvField(pos = 4, required = false)
  @CsvHeader("Wahlvorschlag-Position (Stimmzettel)")
  Long wahlvorschlagPosition;

  @CsvField(pos = 5, required = true)
  @CsvHeader("Wahlvorschlag-Kennwort")
  String wahlvorschlagKennwort;

  @CsvField(pos = 6, required = false)
  @CsvHeader("Wahlvorschlag-Kurzname")
  String wahlvorschlagKurzname;

  /** Nur bei Listenkandidaturen benötigt */
  @CsvField(pos = 7, required = false)
  @CsvHeader("Kandidatur-Listenposition")
  Long kandidaturListenposition;

  /** Nur bei Listenkandidaturen benötigt */
  @CsvField(pos = 8, required = false)
  @CsvHeader("Kandidatur-Anzahl-Nennungen")
  Long kandidaturAnzahlNennungen;

  @CsvField(pos = 9, required = false)
  @CsvHeader("Kandidatur-Akademischer-Grad")
  String kandidaturAkademischerGrad;

  @CsvField(pos = 10, required = false)
  @CsvHeader("Kandidatur-Titel")
  String kandidaturTitel;

  /** Nur bei Kandidaturen benötigt */
  @CsvField(pos = 11, required = false)
  @CsvHeader("Kandidatur-Familienname")
  String kandidaturFamilienname;

  /** Nur bei Kandidaturen benötigt */
  @CsvField(pos = 12, required = false)
  @CsvHeader("Kandidatur-Vorname")
  String kandidaturVorname;

  @CsvField(pos = 13, required = false)
  @CsvHeader("Kandidatur-Beruf")
  String kandidaturBeruf;

  /** Nur bei Kandidaturen benötigt */
  @CsvField(pos = 14, required = false)
  @CsvHeader("Kandidatur-Geschlecht")
  Geschlecht kandidaturGeschlecht = Geschlecht.UNBEKANNT;

  /**
   * Nur bei Kandidaturen benötigt. Ausschließliche Angabe der Jahreszahl möglich. Wird manuell zu Date gemappt, um Locales berücksichtigen zu können.
   */
  @CsvField(pos = 15, required = false)
  @CsvHeader("Kandidatur-Geburtsdatum (" + GEBURTSDATUM_FORMAT_LONG + ")")
  String kandidaturGeburtsdatumAsString;

  @CsvField(pos = 16, required = false)
  @CsvHeader("Kandidatur-Ehrenamt")
  String kandidaturEhrenamt;

  @CsvField(pos = 17, required = false)
  @CsvHeader("Kandidatur-Künstlername")
  String kandidaturKuenstlername;

  @CsvField(pos = 18, required = false)
  @CsvHeader("Kandidatur-Ordensname")
  String kandidaturOrdensname;

  @CsvField(pos = 19, required = false)
  @CsvHeader("Kandidatur-Anschrift-Straße")
  String kandidaturAnschriftStrasse;

  @CsvField(pos = 20, required = false)
  @CsvHeader("Kandidatur-Anschrift-Hausnummer")
  String kandidaturAnschriftHausnummer;

  @CsvField(pos = 21, required = false)
  @CsvHeader("Kandidatur-Anschrift-PLZ")
  String kandidaturAnschriftPLZ;

  @CsvField(pos = 22, required = false)
  @CsvHeader("Kandidatur-Anschrift-Ort")
  String kandidaturAnschriftOrt;

  /** Nur bei Dublette */
  @CsvField(pos = 23, required = false)
  @CsvHeader("Kandidatur-Dublette-Gebietsart")
  String kandidaturDubletteGebietsart;

  /** Nur bei Dublette */
  @CsvField(pos = 24, required = false)
  @CsvHeader("Kandidatur-Dublette-Gebietsnummer")
  String kandidaturDubletteGebietsnummer;

  /** Nur bei Dublette und falls abweichend vom GruppeSchluessel */
  @CsvField(pos = 25, required = false)
  @CsvHeader("Kandidatur-Dublette-Gruppe-Schluessel")
  String kandidaturDubletteGruppeSchluessel;

  /** Nur bei Dublette mit Listenkandidatur */
  @CsvField(pos = 26, required = false)
  @CsvHeader("Kandidatur-Dublette-Listenposition")
  Long kandidaturDubletteListenposition;

  // ELECT-6957
  @CsvField(pos = 28, required = false)
  @CsvHeader("Wahlvorschlag-Position (relativ)")
  Long wahlvorschlagPositionRelativ;

  // ELECT-6957
  @CsvField(pos = 29, required = false)
  @CsvHeader("Wahlvorschlag-Position (vorgegeben)")
  Long wahlvorschlagPositionVorgegeben;

  // ELECT-6957
  @CsvField(pos = 30, required = false)
  @CsvHeader("Wahlvorschlag-Position (eingereicht)")
  Long wahlvorschlagPositionEingereicht;

  @CsvField(pos = 31, required = false)
  @CsvHeader("Kandidatur-Anschrift-Zusatz")
  String kandidaturAnschriftHausnummerzusatz;

  @CsvField(pos = 32, required = false)
  @CsvHeader("Kandidatur-Anschrift-Wohnungsnummer")
  String kandidaturAnschriftWohnungsnummer;

  @CsvField(pos = 33, required = false)
  @CsvHeader("Kandidatur-Anschrift-Ortsteil")
  String kandidaturAnschriftOrtsteil;

  @CsvField(pos = 34, required = false)
  @CsvHeader("Kandidatur-Anschrift-Zustellanweisung")
  String kandidaturAnschriftZustellanweisung;

  @CsvField(pos = 35, required = false)
  @CsvHeader("Kandidatur-Anschrift-Art")
  String kandidaturAnschriftArt;


  @CsvField(pos = 36, required = false)
  @CsvHeader("Gewaehlt-Vorperiode")
  String gewaehltVorperiode;

  @CsvField(pos = 37, required = false)
  @CsvHeader("Kandidatur-Namensbestandteile")
  String kandidaturNamensbestandteile;

  @CsvField(pos = 38, required = false)
  @CsvHeader("Wahlvorschlag-Zusatzbezeichnung")
  String wahlvorschlagZusatzbezeichnung;

  public boolean isKandidaturDubletteDirektkandidatur() {
    return !isKandidaturDubletteListenkandidatur();
  }

  public boolean isKandidaturDubletteListenkandidatur() {
    return hasKandidaturDubletteListenposition();
  }

  public String getGebietsart() {
    return gebietsart;
  }

  public void setGebietsart(String gebietsart) {
    this.gebietsart = gebietsart;
  }

  @Override
  public String getGebietsnummer() {
    return gebietsnummer;
  }

  @Override
  public void setGebietsnummer(String gebietsnummer) {
    this.gebietsnummer = gebietsnummer;
  }

  public boolean hasGruppeSchluessel() {
    return getGruppeSchluessel() != null;
  }

  @Override
  public String getGruppeSchluessel() {
    return gruppeSchluessel;
  }

  public void setGruppeSchluessel(String gruppeSchluessel) {
    this.gruppeSchluessel = gruppeSchluessel;
  }

  @Override
  @Deprecated // ELECT-6957
  public Long getWahlvorschlagPosition() {
    return wahlvorschlagPosition;
  }

  @Override
  @Deprecated // ELECT-6957
  public void setWahlvorschlagPosition(@Nullable Long wahlvorschlagPosition) {
    this.wahlvorschlagPosition = wahlvorschlagPosition;
  }

  @Override
  public String getWahlvorschlagKennwort() {
    return wahlvorschlagKennwort;
  }

  @Override
  public void setWahlvorschlagKennwort(@Nullable String wahlvorschlagKennwort) {
    this.wahlvorschlagKennwort = wahlvorschlagKennwort;
  }

  @Override
  public String getWahlvorschlagZusatzbezeichnung() {
    return wahlvorschlagZusatzbezeichnung;
  }

  @Override
  public void setWahlvorschlagZusatzbezeichnung(String wahlvorschlagZusatzbezeichnung) {
    this.wahlvorschlagZusatzbezeichnung = wahlvorschlagZusatzbezeichnung;
  }

  @Override
  public String getWahlvorschlagKurzname() {
    return wahlvorschlagKurzname;
  }

  @Override
  public void setWahlvorschlagKurzname(@Nullable String wahlvorschlagKurzname) {
    this.wahlvorschlagKurzname = wahlvorschlagKurzname;
  }

  @Override
  public Long getKandidaturListenposition() {
    return kandidaturListenposition;
  }

  @Override
  public void setKandidaturListenposition(@Nullable Long kandidaturListenposition) {
    this.kandidaturListenposition = kandidaturListenposition;
  }

  @Override
  public Long getKandidaturAnzahlNennungen() {
    return kandidaturAnzahlNennungen;
  }

  @Override
  public void setKandidaturAnzahlNennungen(Long kandidaturAnzahlNennungen) {
    this.kandidaturAnzahlNennungen = kandidaturAnzahlNennungen;
  }

  public String getKandidaturAkademischerGrad() {
    return kandidaturAkademischerGrad;
  }

  public void setKandidaturAkademischerGrad(@Nullable String kandidaturAkademischerGrad) {
    this.kandidaturAkademischerGrad = kandidaturAkademischerGrad;
  }

  @Override
  public String getKandidaturTitel() {
    return kandidaturTitel;
  }

  @Override
  public void setKandidaturTitel(@Nullable String kandidaturTitel) {
    this.kandidaturTitel = kandidaturTitel;
  }

  @Override
  public String getKandidaturFamilienname() {
    return kandidaturFamilienname;
  }

  @Override
  public void setKandidaturFamilienname(@Nullable String kandidaturFamilienname) {
    this.kandidaturFamilienname = kandidaturFamilienname;
  }

  @Override
  public String getKandidaturVorname() {
    return kandidaturVorname;
  }

  @Override
  public void setKandidaturVorname(@Nullable String kandidaturVorname) {
    this.kandidaturVorname = kandidaturVorname;
  }

  @Override
  public String getKandidaturBeruf() {
    return kandidaturBeruf;
  }

  @Override
  public void setKandidaturBeruf(@Nullable String kandidaturBeruf) {
    this.kandidaturBeruf = kandidaturBeruf;
  }

  @Override
  public boolean isEinzelbewerber() {
    return isDirektkandidat() && !hasGruppeSchluessel();
  }

  public Geschlecht getKandidaturGeschlecht() {
    return kandidaturGeschlecht;
  }

  public void setKandidaturGeschlecht(Geschlecht kandidaturGeschlecht) {
    this.kandidaturGeschlecht = kandidaturGeschlecht;
  }

  @Override
  @Nullable
  public Date getKandidaturGeburtsdatum(Locale locale) throws MappingException {
    return getDateFromString(getKandidaturGeburtsdatumAsString(), GEBURTSDATUM_FORMAT_LONG, GEBURTSDATUM_FORMAT_SHORT, locale);
  }

  @Override
  public void setKandidaturGeburtsdatum(@Nullable Date date, Locale locale) {
    setKandidaturGeburtsdatumAsString(formatDate(GEBURTSDATUM_FORMAT_LONG, date, locale));
  }

  public void setKandidaturGeburtsjahr(@Nullable Date date, Locale locale) {
    setKandidaturGeburtsdatumAsString(formatDate(GEBURTSDATUM_FORMAT_SHORT, date, locale));
  }

  public String getKandidaturGeburtsdatumAsString() {
    return kandidaturGeburtsdatumAsString;
  }

  public void setKandidaturGeburtsdatumAsString(@Nullable String kandidaturGeburtsdatumAsString) {
    this.kandidaturGeburtsdatumAsString = kandidaturGeburtsdatumAsString;
  }

  public String getKandidaturEhrenamt() {
    return kandidaturEhrenamt;
  }

  public void setKandidaturEhrenamt(@Nullable String kandidaturEhrenamt) {
    this.kandidaturEhrenamt = kandidaturEhrenamt;
  }

  public String getKandidaturKuenstlername() {
    return kandidaturKuenstlername;
  }

  public void setKandidaturKuenstlername(@Nullable String kandidaturKuenstlername) {
    this.kandidaturKuenstlername = kandidaturKuenstlername;
  }

  public String getKandidaturOrdensname() {
    return kandidaturOrdensname;
  }

  public void setKandidaturOrdensname(@Nullable String kandidaturOrdensname) {
    this.kandidaturOrdensname = kandidaturOrdensname;
  }

  public String getKandidaturAnschriftStrasse() {
    return kandidaturAnschriftStrasse;
  }

  public void setKandidaturAnschriftStrasse(@Nullable String kandidaturAnschriftStrasse) {
    this.kandidaturAnschriftStrasse = kandidaturAnschriftStrasse;
  }

  public String getKandidaturAnschriftHausnummer() {
    return kandidaturAnschriftHausnummer;
  }

  public void setKandidaturAnschriftHausnummer(@Nullable String kandidaturAnschriftHausnummer) {
    this.kandidaturAnschriftHausnummer = kandidaturAnschriftHausnummer;
  }

  public String getKandidaturAnschriftPLZ() {
    return kandidaturAnschriftPLZ;
  }

  public void setKandidaturAnschriftPLZ(@Nullable String kandidaturAnschriftPLZ) {
    this.kandidaturAnschriftPLZ = kandidaturAnschriftPLZ;
  }

  public String getKandidaturAnschriftOrt() {
    return kandidaturAnschriftOrt;
  }

  public void setKandidaturAnschriftOrt(@Nullable String kandidaturAnschriftOrt) {
    this.kandidaturAnschriftOrt = kandidaturAnschriftOrt;
  }

  public String getKandidaturAnschriftOrtsteil() {
    return kandidaturAnschriftOrtsteil;
  }

  public void setKandidaturAnschriftOrtsteil(String kandidaturAnschriftOrtsteil) {
    this.kandidaturAnschriftOrtsteil = kandidaturAnschriftOrtsteil;
  }

  @Override
  public boolean hasKandidaturDublette() {
    return hasKandidaturDubletteGebietsart() || hasKandidaturDubletteGebietsnummer() || hasKandidaturDubletteGruppeSchluessel() || hasKandidaturDubletteListenposition();
  }

  public boolean hasKandidaturDubletteGebietsart() {
    return getKandidaturDubletteGebietsart() != null;
  }

  @Override
  public String getKandidaturDubletteGebietsart() {
    return kandidaturDubletteGebietsart;
  }

  public void setKandidaturDubletteGebietsart(String kandidaturDubletteGebietsart) {
    this.kandidaturDubletteGebietsart = kandidaturDubletteGebietsart;
  }

  public boolean hasKandidaturDubletteGebietsnummer() {
    return getKandidaturDubletteGebietsnummer() != null;
  }

  public String getKandidaturDubletteGebietsnummer() {
    return kandidaturDubletteGebietsnummer;
  }

  public void setKandidaturDubletteGebietsnummer(String kandidaturDubletteGebietsnummer) {
    this.kandidaturDubletteGebietsnummer = kandidaturDubletteGebietsnummer;
  }

  public boolean hasKandidaturDubletteGruppeSchluessel() {
    return getKandidaturDubletteGruppeSchluessel() != null;
  }

  @Override
  public String getKandidaturDubletteGruppeSchluessel() {
    return kandidaturDubletteGruppeSchluessel;
  }

  public void setKandidaturDubletteGruppeSchluessel(String kandidaturDubletteGruppeSchluessel) {
    this.kandidaturDubletteGruppeSchluessel = kandidaturDubletteGruppeSchluessel;
  }

  @Override
  public boolean hasKandidaturDubletteListenposition() {
    return getKandidaturDubletteListenposition() != null;
  }

  @Override
  public Long getKandidaturDubletteListenposition() {
    return kandidaturDubletteListenposition;
  }

  public void setKandidaturDubletteListenposition(@Nullable Long kandidaturDubletteListenposition) {
    this.kandidaturDubletteListenposition = kandidaturDubletteListenposition;
  }

  public Long getWahlvorschlagPositionVorgegeben() {
    return wahlvorschlagPositionVorgegeben;
  }

  public void setWahlvorschlagPositionVorgegeben(Long wahlvorschlagPositionVorgegeben) {
    this.wahlvorschlagPositionVorgegeben = wahlvorschlagPositionVorgegeben;
  }

  public Long getWahlvorschlagPositionRelativ() {
    return wahlvorschlagPositionRelativ;
  }

  public void setWahlvorschlagPositionRelativ(Long wahlvorschlagPositionRelativ) {
    this.wahlvorschlagPositionRelativ = wahlvorschlagPositionRelativ;
  }

  public Long getWahlvorschlagPositionEingereicht() {
    return wahlvorschlagPositionEingereicht;
  }

  public void setWahlvorschlagPositionEingereicht(Long wahlvorschlagPositionEingereicht) {
    this.wahlvorschlagPositionEingereicht = wahlvorschlagPositionEingereicht;
  }

  public String getKandidaturAnschriftHausnummerzusatz() {
    return kandidaturAnschriftHausnummerzusatz;
  }

  public void setKandidaturAnschriftHausnummerzusatz(String kandidaturAnschriftHausnummerzusatz) {
    this.kandidaturAnschriftHausnummerzusatz = kandidaturAnschriftHausnummerzusatz;
  }

  public String getKandidaturAnschriftWohnungsnummer() {
    return kandidaturAnschriftWohnungsnummer;
  }

  public void setKandidaturAnschriftWohnungsnummer(String kandidaturAnschriftWohnungsnummer) {
    this.kandidaturAnschriftWohnungsnummer = kandidaturAnschriftWohnungsnummer;
  }

  public String getKandidaturAnschriftZustellanweisung() {
    return kandidaturAnschriftZustellanweisung;
  }

  public void setKandidaturAnschriftZustellanweisung(String kandidaturAnschriftZustellanweisung) {
    this.kandidaturAnschriftZustellanweisung = kandidaturAnschriftZustellanweisung;
  }

  public String getKandidaturAnschriftArt() {
    return kandidaturAnschriftArt;
  }

  public void setKandidaturAnschriftArt(String kandidaturAnschriftArt) {
    this.kandidaturAnschriftArt = kandidaturAnschriftArt;
  }

  public boolean hasKandidaturAnschriftArt() {
    return kandidaturAnschriftArt != null;
  }

  public String getGewaehltVorperiode() {
    return gewaehltVorperiode;
  }

  public void setGewaehltVorperiode(String gewaehltVorperiode) {
    this.gewaehltVorperiode = gewaehltVorperiode;
  }

  @Override
  public String getKandidaturNamensbestandteile() {
    return kandidaturNamensbestandteile;
  }

  @Override
  public void setKandidaturNamensbestandteile(String kandidaturNamensbestandteile) {
    this.kandidaturNamensbestandteile = kandidaturNamensbestandteile;
  }
}
