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

import static de.ivu.elect.business.wahl.entity.WahlOderWahltermin.from;

import java.io.Serializable;

import javax.annotation.Nullable;

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.exchange.control.AbstractContextMitCustomParameter;
import de.ivu.elect.business.exchange.control.ContextMitCustomParameter;
import de.ivu.elect.business.gebietsbaum.boundary.AbstractGebietDAO;
import de.ivu.elect.business.gebietsbaum.control.EntityMitWurzelgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.Messages;

public class ElectDokumentContext extends AbstractContextMitCustomParameter implements Serializable, ContextMitCustomParameter {

  private static final long serialVersionUID = 1L;

  private final Benutzer benutzer;

  private final Messages messages;

  private final Wahl wahl;

  private final Wahltermin wahltermin;

  public ElectDokumentContext(ElectDokumentContext other) {
    this(other.getBenutzer(), other.getMessages(), other.getWahltermin(), other.getWahl());

    this.getContextParameters().putAll(other.getContextParameters());
  }

  public ElectDokumentContext(Benutzer benutzer, Messages messages, @Nullable Wahltermin wahltermin, @Nullable Wahl wahl) {
    super();

    this.benutzer = benutzer;

    this.messages = messages;

    this.wahltermin = wahltermin;
    this.wahl = wahl;
  }

  public Benutzer getBenutzer() {
    return benutzer;
  }

  public Messages getMessages() {
    return messages;
  }

  public String getMessage(Boolean value) {
    return getMessages().lokalisiere(value);
  }

  public String getMessage(Enum< ? > enumValue) {
    return getMessages().lokalisiere(enumValue);
  }

  public String getMessageGendered(Enum< ? > enumValue, Geschlecht geschlecht) {
    return getMessages().lokalisiere(enumValue, geschlecht);
  }

  public String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  public Wahl getWahl() {
    return wahl;
  }

  public Wahltermin getWahltermin() {
    return wahltermin;
  }

  public WahlOderWahltermin getWahlOderWahltermin() {
    return from(getWahltermin(), getWahl());
  }

  public Gebiet getWurzelgebiet(AbstractGebietDAO gebietDAO) {
    return getWahlOderWahltermin().getWurzelgebiet(EntityMitWurzelgebietDAO.fromDao(gebietDAO));
  }

  public Mandant getMandant() {
    if (getBenutzer() != null && getBenutzer().isPersistent()) {
      return getBenutzer().getMandant();
    }
    if (getWahl() != null) {
      return getWahl().getMandant();
    }
    if (getWahltermin() != null) {
      return getWahltermin().getMandant();
    }
    return null;
  }
}
