
package de.ivu.elect.business.gruppe.entity;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.NlListeCustomDataReferenz;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.entity.customdata.DefaultCustomData;
import de.ivu.elect.jee.protokollierung.AttributTyp;


import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
import static org.apache.commons.lang3.StringUtils.isBlank;

public class NlGruppeCustomData extends DefaultCustomData {

  private static final long serialVersionUID = 1L;

  private String nameAbgelehntBemerkung; // ELECT-10160

  private Long anzahlSitzeVorperiode;

  private Long anzahlStimmenVorperiode;

  private boolean vorgeschlagenePositionGueltig;

  private String vorgeschlagenePositionen;

  private boolean vornamenAusblenden; // ELECTVAPP-1351

  /**
   * @deprecated Nur für WAS nicht direkt verwenden (!)...
   * @see NlPolitischeGruppe#bestimmeEinreichungsart
   */
  @Deprecated
  private NlPolitischeGruppeArt nlPolitischeGruppeArt;

  /**
   * @deprecated ELECT-11274
   * @see NlGruppeCustomData#zulassungAbgelehntBegruendungPerListeReferenz
   */
  @Deprecated
  private Map<Long, String> zulassungAbgelehntBegruendungPerWahlvorschlagPk;

  private Map<NlListeCustomDataReferenz, String> zulassungAbgelehntBegruendungPerListeReferenz;

  /**
   * @deprecated ELECT-11275
   * @see Kandidatur#getBemerkung
   */
  @Deprecated
  private Map<Long, String> zulassungAbgelehntBegruendungPerKandidaturPk;

  public NlGruppeCustomData() {
    super();
  }

  public String getNameAbgelehntBemerkung() {
    return nameAbgelehntBemerkung;
  }

  public void setNameAbgelehntBemerkung(String nameAbgelehntBemerkung) {
    this.notifyEntity("entity.einzahl.GRUPPE.NAME_ABGELEHNT_BEMERKUNG", AttributTyp.STRING, this.nameAbgelehntBemerkung, this.nameAbgelehntBemerkung = nameAbgelehntBemerkung);
  }

  public Long getAnzahlSitzeVorperiode() {
    return anzahlSitzeVorperiode;
  }

  public long getAnzahlSitzeVorperiodeNotNull() {
    if (anzahlSitzeVorperiode == null) {
      return 0L;
    }

    return anzahlSitzeVorperiode;
  }

  public void setAnzahlSitzeVorperiode(Long anzahlSitzeVorperiode) {
    this.notifyEntity("entity.einzahl.GRUPPE.ANZAHL_SITZE_VORPERIODE", AttributTyp.LONG, this.anzahlSitzeVorperiode, this.anzahlSitzeVorperiode = anzahlSitzeVorperiode);
  }

  public Long getAnzahlStimmenVorperiode() {
    return anzahlStimmenVorperiode;
  }

  public long getAnzahlStimmenVorperiodeNotNull() {
    if (anzahlStimmenVorperiode == null) {
      return 0L;
    }

    return anzahlStimmenVorperiode;
  }

  public void setAnzahlStimmenVorperiode(Long anzahlStimmenVorperiode) {
    this.notifyEntity("entity.einzahl.GRUPPE.ANZAHL_STIMMEN_VORPERIODE", AttributTyp.LONG, this.anzahlStimmenVorperiode, this.anzahlStimmenVorperiode = anzahlStimmenVorperiode);
  }

  public boolean isVorgeschlagenePositionGueltig() {
    return vorgeschlagenePositionGueltig;
  }

  public void setVorgeschlagenePositionGueltig(boolean vorgeschlagenePositionGueltig) {
    this.notifyEntity("entity.einzahl.GRUPPE.VORGESCHLAGENE_POSITION_GUELTIG", AttributTyp.BOOLEAN, this.vorgeschlagenePositionGueltig,
        this.vorgeschlagenePositionGueltig = vorgeschlagenePositionGueltig);
  }

  public boolean isVornamenAusblenden() {
    return vornamenAusblenden;
  }

  public void setVornamenAusblenden(boolean vornamenAusblenden) {
    this.notifyEntity("entity.einzahl.GRUPPE.VORNAMEN_AUSBLENDEN", AttributTyp.BOOLEAN, this.vornamenAusblenden,
        this.vornamenAusblenden = vornamenAusblenden);
  }

  private String getVorgeschlagenePositionen() {
    return vorgeschlagenePositionen;
  }

  private void setVorgeschlagenePositionen(String vorgeschlagenePositionen) {
    this.notifyEntity("entity.einzahl.GRUPPE.VORGESCHLAGENE_POSITIONEN", AttributTyp.STRING, this.vorgeschlagenePositionen, this.vorgeschlagenePositionen = vorgeschlagenePositionen);
  }

  public Set<Long> getVorgeschlagenePositionenReadOnly() {
    if (StringUtils.isBlank(vorgeschlagenePositionen)) {
      return Collections.emptySet();
    }

    return Collections.unmodifiableSet(Arrays.stream(vorgeschlagenePositionen.split(Pattern.quote("|"))).map(Long::valueOf).collect(Collectors.toSet()));
  }

  public void clearVorgeschlagenePositionen() {
    setVorgeschlagenePositionen(null);
  }

  public void addVorgeschlagenePosition(Long l) {
    if (l == null) {
      return;
    }

    Set<Long> newSet = new HashSet<>(getVorgeschlagenePositionenReadOnly());
    newSet.add(l);

    setVorgeschlagenePositionen(newSet.stream().map(value -> Long.toString(value)).collect(Collectors.joining("|")));
  }

  /**
   * @deprecated Nur für WAS nicht direkt verwenden (!)...
   * @see NlPolitischeGruppe#bestimmeEinreichungsart
   */
  @Deprecated
  public NlPolitischeGruppeArt getNlPolitischeGruppeArt() {
    return nlPolitischeGruppeArt;
  }

  /**
   * @deprecated Nur für WAS nicht direkt verwenden (!)...
   * @see NlPolitischeGruppe#bestimmeEinreichungsart
   */
  @Deprecated
  public void setNlPolitischeGruppeArt(NlPolitischeGruppeArt nlPolitischeGruppeArt) {
    this.notifyEntity("entity.einzahl.GRUPPE.NL_POLITISCHE_GRUPPE_ART", AttributTyp.ENUM, this.nlPolitischeGruppeArt, this.nlPolitischeGruppeArt = nlPolitischeGruppeArt);
  }

  public String getZulassungAbgelehntBegruendung(Wahlvorschlag wahlvorschlag) {
    String result = getZulassungAbgelehntBegruendungPerListeReferenz().get(NlListeCustomDataReferenz.of(wahlvorschlag));

    if (isBlank(result) && zulassungAbgelehntBegruendungPerWahlvorschlagPk != null && wahlvorschlag != null) {
      result = zulassungAbgelehntBegruendungPerWahlvorschlagPk.get(wahlvorschlag.getId());
    }

    return defaultIfBlank(result, "");
  }

  public void setZulassungAbgelehntBegruendung(Wahlvorschlag wahlvorschlag, String begruendung) {
    NlListeCustomDataReferenz nlListeCustomDataReferenz = NlListeCustomDataReferenz.of(wahlvorschlag);

    if (!nlListeCustomDataReferenz.isEmpty()) {
      getZulassungAbgelehntBegruendungPerListeReferenz().put(nlListeCustomDataReferenz, begruendung);

      this.notifyEntity();
    }
  }

  private Map<NlListeCustomDataReferenz, String> getZulassungAbgelehntBegruendungPerListeReferenz() {
    if (zulassungAbgelehntBegruendungPerListeReferenz == null) {
      zulassungAbgelehntBegruendungPerListeReferenz = new HashMap<>();
    }

    return zulassungAbgelehntBegruendungPerListeReferenz;
  }

  public String getZulassungAbgelehntBegruendung(Kandidatur kandidatur) {
    String result = "";

    if (kandidatur != null) {
      result = kandidatur.getBemerkung(); // ELECT-11275

      if (isBlank(result) && zulassungAbgelehntBegruendungPerKandidaturPk != null) {
        result = zulassungAbgelehntBegruendungPerKandidaturPk.get(kandidatur.getId());
      }
    }

    return defaultIfBlank(result, "");
  }

  public void setZulassungAbgelehntBegruendung(Kandidatur kandidatur, String begruendung) {
    if (kandidatur != null) {
      kandidatur.setBemerkung(begruendung);

      this.notifyEntity();
    }
  }
}
