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

import de.ivu.elect.business.wahlrechtspruefung.entity.WahlrechtspruefStatus;
import org.apache.commons.lang3.StringUtils;
import org.jsefa.csv.annotation.CsvDataType;
import org.jsefa.csv.annotation.CsvField;

import de.ivu.elect.business.wahlrechtspruefung.entity.Pruefkriterium;
import de.ivu.elect.business.wahlrechtspruefung.entity.PruefkriteriumBezug;
import de.ivu.elect.business.wahlrechtspruefung.entity.PruefkriteriumGruppeArt;
import de.ivu.jsefa.CsvHeader;

@CsvDataType
public class PruefkriteriumCsv {

  @CsvField(pos = 1, required = true)
  @CsvHeader("Position")
  Long position;

  @CsvField(pos = 2, required = true)
  @CsvHeader("Prüfkriteriumbezug")
  String pruefkriteriumBezug;

  @CsvField(pos = 3, required = false)
  @CsvHeader("Kategorie")
  String kategorie;

  @CsvField(pos = 4, required = false)
  @CsvHeader("Unterkategorie")
  String unterkategorie;

  @CsvField(pos = 5, required = true)
  @CsvHeader("Kriteriumtext")
  String kriteriumtext;

  @CsvField(pos = 6, required = false)
  @CsvHeader("Text für Protokoll (erfüllt)")
  String textFuerProtokollErfuellt;

  @CsvField(pos = 7, required = false)
  @CsvHeader("Text für Protokoll (nicht erfüllt)")
  String textFuerProtokollNichtErfuellt;

  @CsvField(pos = 8, required = false)
  @CsvHeader("Text für Protokoll (Frist)")
  String textFuerProtokollFrist;

  @CsvField(pos = 9, required = true)
  @CsvHeader("Heilungsfähig")
  Boolean heilungsfaehig;

  @CsvField(pos = 10, required = false)
  @CsvHeader("Frist in Tagen bis zur Wahl")
  Long fristInTagenBisZurWahl;

  @CsvField(pos = 11, required = true)
  @CsvHeader("Kann irrelevant sein")
  Boolean kannIrrelevantSein;

  @CsvField(pos = 12, required = true)
  @CsvHeader("Teil der Sofortpruefung")
  Boolean teilDerSofortpruefung;

  @CsvField(pos = 13, required = true)
  @CsvHeader("Wahlrechtlich relevant")
  Boolean wahlrechtichRelevant;

  @CsvField(pos = 14, required = false /*legacy*/)
  @CsvHeader("Bezug Gruppenart")
  String gruppeArt;

  // required=false nur für Abwärtskompatibilität
  @CsvField(pos = 15, required = false)
  @CsvHeader("Initialer Status")
  String initialerStatus;

  public PruefkriteriumCsv() {
    super();
  }

  public PruefkriteriumCsv(Pruefkriterium pruefkriterium) {
    this.position = pruefkriterium.getPosition();
    this.fristInTagenBisZurWahl = pruefkriterium.getFristInTagenBisZurWahl();
    this.textFuerProtokollFrist = pruefkriterium.getTextFuerProtokollFrist();
    this.unterkategorie = pruefkriterium.getUnterkategorie();
    this.textFuerProtokollNichtErfuellt = pruefkriterium.getTextFuerProtokollNichtErfuellt();
    this.kriteriumtext = pruefkriterium.getKriteriumtext();
    this.heilungsfaehig = pruefkriterium.getHeilungsfaehig();
    this.kannIrrelevantSein = pruefkriterium.getKannIrrelevantSein();
    this.pruefkriteriumBezug = pruefkriterium.getPruefkriteriumBezug().name();
    this.textFuerProtokollErfuellt = pruefkriterium.getTextFuerProtokollErfuellt();
    this.teilDerSofortpruefung = pruefkriterium.getTeilDerSofortpruefung();
    this.kategorie = pruefkriterium.getKategorie();
    this.wahlrechtichRelevant = pruefkriterium.getWahlrechtlichRelevant();
    this.gruppeArt = pruefkriterium.getPruefkriteriumGruppeArt().name();
    this.initialerStatus = pruefkriterium.getInitialerStatus().name();
  }

  public Pruefkriterium createPruefkriterium() {
    Pruefkriterium pruefkriterium = new Pruefkriterium();
    pruefkriterium.setPosition(position);
    pruefkriterium.setFristInTagenBisZurWahl(fristInTagenBisZurWahl);
    pruefkriterium.setTextFuerProtokollFrist(textFuerProtokollFrist);
    pruefkriterium.setUnterkategorie(unterkategorie);
    pruefkriterium.setTextFuerProtokollNichtErfuellt(textFuerProtokollNichtErfuellt);
    pruefkriterium.setKriteriumtext(kriteriumtext);
    pruefkriterium.setHeilungsfaehig(heilungsfaehig);
    pruefkriterium.setKannIrrelevantSein(kannIrrelevantSein);
    pruefkriterium.setPruefkriteriumBezug(PruefkriteriumBezug.valueOf(pruefkriteriumBezug));
    if (StringUtils.isNotBlank(gruppeArt)) {
      pruefkriterium.setPruefkriteriumGruppeArt(PruefkriteriumGruppeArt.valueOf(gruppeArt));
    }
    pruefkriterium.setTextFuerProtokollErfuellt(textFuerProtokollErfuellt);
    pruefkriterium.setTeilDerSofortpruefung(teilDerSofortpruefung);
    pruefkriterium.setKategorie(kategorie);
    pruefkriterium.setWahlrechtlichRelevant(wahlrechtichRelevant);
    pruefkriterium.setInitialerStatus(initialerStatus == null ? WahlrechtspruefStatus.UNGEPRUEFT : WahlrechtspruefStatus.valueOf(initialerStatus));

    return pruefkriterium;
  }

  public Long getPosition() {
    return position;
  }

  public void setPosition(Long position) {
    this.position = position;
  }

  public String getPruefkriteriumBezug() {
    return pruefkriteriumBezug;
  }

  public void setPruefkriteriumBezug(String pruefkriteriumBezug) {
    this.pruefkriteriumBezug = pruefkriteriumBezug;
  }

  public String getKategorie() {
    return kategorie;
  }

  public void setKategorie(String kategorie) {
    this.kategorie = kategorie;
  }

  public String getUnterkategorie() {
    return unterkategorie;
  }

  public void setUnterkategorie(String unterkategorie) {
    this.unterkategorie = unterkategorie;
  }

  public String getKriteriumtext() {
    return kriteriumtext;
  }

  public void setKriteriumtext(String kriteriumtext) {
    this.kriteriumtext = kriteriumtext;
  }

  public String getTextFuerProtokollErfuellt() {
    return textFuerProtokollErfuellt;
  }

  public void setTextFuerProtokollErfuellt(String textFuerProtokollErfuellt) {
    this.textFuerProtokollErfuellt = textFuerProtokollErfuellt;
  }

  public String getTextFuerProtokollNichtErfuellt() {
    return textFuerProtokollNichtErfuellt;
  }

  public void setTextFuerProtokollNichtErfuellt(String textFuerProtokollNichtErfuellt) {
    this.textFuerProtokollNichtErfuellt = textFuerProtokollNichtErfuellt;
  }

  public String getTextFuerProtokollFrist() {
    return textFuerProtokollFrist;
  }

  public void setTextFuerProtokollFrist(String textFuerProtokollFrist) {
    this.textFuerProtokollFrist = textFuerProtokollFrist;
  }

  public Boolean getHeilungsfaehig() {
    return heilungsfaehig;
  }

  public void setHeilungsfaehig(Boolean heilungsfaehig) {
    this.heilungsfaehig = heilungsfaehig;
  }

  public Long getFristInTagenBisZurWahl() {
    return fristInTagenBisZurWahl;
  }

  public void setFristInTagenBisZurWahl(Long fristInTagenBisZurWahl) {
    this.fristInTagenBisZurWahl = fristInTagenBisZurWahl;
  }

  public Boolean getKannIrrelevantSein() {
    return kannIrrelevantSein;
  }

  public void setKannIrrelevantSein(Boolean kannIrrelevantSein) {
    this.kannIrrelevantSein = kannIrrelevantSein;
  }

  public Boolean getTeilDerSofortpruefung() {
    return teilDerSofortpruefung;
  }

  public void setTeilDerSofortpruefung(Boolean teilDerSofortpruefung) {
    this.teilDerSofortpruefung = teilDerSofortpruefung;
  }

  public Boolean getWahlrechtichRelevant() {
    return wahlrechtichRelevant;
  }

  public void setWahlrechtichRelevant(Boolean wahlrechtichRelevant) {
    this.wahlrechtichRelevant = wahlrechtichRelevant;
  }

  public String getInitialerStatus() {
    return initialerStatus;
  }

  public void setInitialerStatus(String initialerStatus) {
    this.initialerStatus = initialerStatus;
  }
}
