
package de.ivu.elect.business.kandidatur.control;

import de.ivu.elect.business.exchange.control.AbstractWahlExchangeContext;
import de.ivu.elect.business.gebietsbaum.boundary.AbstractGebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamicform.AbstractEnumProperty;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import static de.ivu.elect.business.gebietsbaum.control.EntityMitWurzelgebietDAO.fromDao;

public class WahlvorschlagImportContext extends AbstractWahlExchangeContext {

  private static final long serialVersionUID = 1L;

  private final Gebiet wurzelgebiet;

  private final List<Gebiet> listenwahlgebiete;

  private final List<Gebiet> direktwahlgebiete;

  private final Locale locale;

  private WahlvorschlagImporterZulassungsVerhalten zulassungsVerhalten;

  private Boolean kennwortVonGruppeUebernehmenWennNichtGesetzt;

  // ELECT-4324 ELECT-5265
  private Boolean kurznameVonGruppeUebernehmenWennNichtGesetzt;
  private List<Gebiet> berechtigenGebieten = new ArrayList<>();

  public WahlvorschlagImportContext(Wahl wahl, Locale locale, @Nonnull AbstractGebietDAO gebietDAO) {
    this(wahl, locale, gebietDAO, null);
  }

  public WahlvorschlagImportContext(Wahl wahl, Locale locale, @Nonnull AbstractGebietDAO gebietDAO, WahlvorschlagImporterZulassungsVerhalten zulassungsVerhalten) {
    this(wahl, locale, findWurzelgebiet(wahl, gebietDAO), findListenwahlgebiete(wahl, gebietDAO), findDirektwahlgebiete(wahl, gebietDAO), zulassungsVerhalten);
  }

  public WahlvorschlagImportContext(Wahl wahl, Locale locale, @Nullable Gebiet wurzelgebiet, List<Gebiet> listenwahlgebiete, List<Gebiet> direktwahlgebiete, WahlvorschlagImporterZulassungsVerhalten zulassungsVerhalten) {
    super(wahl);

    this.locale = locale;

    this.wurzelgebiet = wurzelgebiet;
    this.listenwahlgebiete = listenwahlgebiete;
    this.direktwahlgebiete = direktwahlgebiete;

    this.zulassungsVerhalten = zulassungsVerhalten;

    // Standardwerte NICHT ÄNDERN -> sind nur gezielt beim manuellen Import überschreibbar!
    this.kennwortVonGruppeUebernehmenWennNichtGesetzt = true;
    this.kurznameVonGruppeUebernehmenWennNichtGesetzt = true;
  }

  public Gebiet getWurzelgebiet() {
    return wurzelgebiet;
  }

  public List<Gebiet> getListenwahlgebiete() {
    return listenwahlgebiete;
  }

  public List<Gebiet> getDirektwahlgebiete() {
    return direktwahlgebiete;
  }

  public Locale getLocale() {
    return locale;
  }

  public WahlvorschlagImporterZulassungsVerhalten getZulassungsVerhalten() {
    return zulassungsVerhalten;
  }

  public void setZulassungsVerhalten(WahlvorschlagImporterZulassungsVerhalten zulassungsVerhalten) {
    this.zulassungsVerhalten = zulassungsVerhalten;
  }

  public AbstractEnumProperty<WahlvorschlagImporterZulassungsVerhalten> getZulassungsVerhaltenProperty() {
    return new WahlvorschlagImporterZulassungsVerhaltenProperty(this);
  }

  public Boolean getKurznameVonGruppeUebernehmenWennNichtGesetzt() {
    return Boolean.TRUE.equals(kurznameVonGruppeUebernehmenWennNichtGesetzt);
  }

  public void setKurznameVonGruppeUebernehmenWennNichtGesetzt(boolean kurznameVonGruppeUebernehmenWennNichtGesetzt) {
    this.kurznameVonGruppeUebernehmenWennNichtGesetzt = kurznameVonGruppeUebernehmenWennNichtGesetzt;
  }

  public Boolean getKennwortVonGruppeUebernehmenWennNichtGesetzt() {
    return Boolean.TRUE.equals(kennwortVonGruppeUebernehmenWennNichtGesetzt);
  }

  public void setKennwortVonGruppeUebernehmenWennNichtGesetzt(boolean kennwortVonGruppeUebernehmenWennNichtGesetzt) {
    this.kennwortVonGruppeUebernehmenWennNichtGesetzt = kennwortVonGruppeUebernehmenWennNichtGesetzt;
  }

  private static Gebiet findWurzelgebiet(Wahl wahl, AbstractGebietDAO gebietDAO) {
    return wahl == null ? null : wahl.getWurzelgebiet(fromDao(gebietDAO));
  }

  private static List<Gebiet> findListenwahlgebiete(Wahl wahl, AbstractGebietDAO gebietDAO) {
    return wahl == null ? null : gebietDAO.findByWahlAndListengebiet(wahl, true);
  }

  private static List<Gebiet> findDirektwahlgebiete(Wahl wahl, AbstractGebietDAO gebietDAO) {
    return wahl == null ? null : gebietDAO.findByWahlAndDirektwahlgebiet(wahl, true);
  }

  public void setBerechtigenGebieten(List<Gebiet> berechtigenGebieten) {
    this.berechtigenGebieten = berechtigenGebieten;
  }

  public List<Gebiet> getBerechtigenGebieten() {
    return berechtigenGebieten;
  }
}
