package de.ivu.elect.exchange.benutzer.csv;

import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.exchange.benutzer.DefaultBenutzer;
import de.ivu.elect.exchange.benutzer.DefaultRolle;
import de.ivu.jsefa.CsvHeader;
import org.apache.commons.lang3.StringUtils;
import org.jsefa.csv.annotation.CsvDataType;
import org.jsefa.csv.annotation.CsvField;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Überarbeitetes Standard-CSV-Format für Benutzer (ELECT-13226)
 */
@CsvDataType
public class DefaultBenutzerCsvDTO implements DefaultBenutzer {

  private static final String ROLLEN_SEPARATOR = ",";

  @CsvField(pos = 1)
  @CsvHeader("Benutzerkennung")
  private String benutzerkennung;

  @CsvField(pos = 2)
  @CsvHeader("Passwort")
  private String passwort;

  @CsvField(pos = 3)
  @CsvHeader("Salt")
  private String salt;

  @CsvField(pos = 4)
  @CsvHeader("Aktiv")
  private Boolean aktiv;

  @CsvField(pos = 5)
  @CsvHeader("Bemerkung")
  private String bemerkung;

  @CsvField(pos = 6)
  @CsvHeader("Familienname")
  private String familienname;

  @CsvField(pos = 7)
  @CsvHeader("Vorname")
  private String vorname;

  @CsvField(pos = 8)
  @CsvHeader("Geschlecht")
  private Geschlecht geschlecht;

  @CsvField(pos = 9)
  @CsvHeader("Muss Passwort wechseln")
  private Boolean mussPasswortWechseln;

  @CsvField(pos = 10)
  @CsvHeader("Rollen")
  private String rollen;

  @Override
  public String getBenutzerkennung() {
    return benutzerkennung;
  }

  @Override
  public void setBenutzerkennung(String benutzerkennung) {
    this.benutzerkennung = benutzerkennung;
  }

  @Override
  public String getPasswort() {
    return passwort;
  }

  @Override
  public void setPasswort(String passwort) {
    this.passwort = passwort;
  }

  @Override
  public String getSalt() {
    return salt;
  }

  @Override
  public void setSalt(String salt) {
    this.salt = salt;
  }

  @Override
  public Boolean isAktiv() {
    return aktiv;
  }

  @Override
  public void setAktiv(Boolean aktiv) {
    this.aktiv = aktiv;
  }

  @Override
  public String getBemerkung() {
    return bemerkung;
  }

  @Override
  public void setBemerkung(String bermerkung) {
    this.bemerkung = bemerkung;
  }

  @Override
  public String getFamilienname() {
    return familienname;
  }

  @Override
  public void setFamilienname(String familienname) {
    this.familienname = familienname;
  }

  @Override
  public String getVorname() {
    return vorname;
  }

  @Override
  public void setVorname(String vorname) {
    this.vorname = vorname;
  }

  @Override
  public Geschlecht getGeschlecht() {
    return geschlecht;
  }

  @Override
  public void setGeschlecht(Geschlecht geschlecht) {
    this.geschlecht = geschlecht;
  }

  @Override
  public Boolean getMussPasswortWechseln() {
    return mussPasswortWechseln;
  }

  @Override
  public void setMussPasswortWechseln(Boolean mussPasswortWechseln) {
    this.mussPasswortWechseln = mussPasswortWechseln;
  }

  @Override
  public List<DefaultRolle> getRollen() {
    if (rollen == null) {
      return Collections.emptyList();
    }
    return Arrays.stream(rollen.split(ROLLEN_SEPARATOR)).map(DefaultRolle::new).collect(Collectors.toList());
  }

  @Override
  public void setRollen(List<DefaultRolle> rollen) {
    this.rollen = rollen.stream().map(DefaultRolle::getName).collect(Collectors.joining(ROLLEN_SEPARATOR));
  }

  @Override
  public void addRolle(DefaultRolle rolle) {
    if (StringUtils.isBlank(rollen)) {
      rollen = rolle.getName();
    } else {
      rollen += ROLLEN_SEPARATOR + rolle.getName();
    }
  }
}
