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

import static de.ivu.elect.business.mandant.entity.AbstractMandant.SYSTEM_MANDANT_NUMMER;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.Collection;

import de.ivu.elect.business.mandant.entity.AbstractMandant;
import de.ivu.elect.business.mandant.entity.MandantUK;

public abstract class AbstractNachricht implements NachrichtBase {

  private static final long serialVersionUID = 1L;

  public AbstractNachricht() {
    super();
  }

  public boolean isEmpfaengerAlle() {
    return NachrichtEmpfaengerGruppeArt.ALLE.equals(getEmpfaengerGruppeArt());
  }

  public boolean isEmpfaengerAdressiert() {
    return NachrichtEmpfaengerGruppeArt.ADRESSIERT.equals(getEmpfaengerGruppeArt());
  }

  public boolean isEmpfaengerAntwort() {
    return NachrichtEmpfaengerGruppeArt.ANTWORT.equals(getEmpfaengerGruppeArt());
  }

  public BenutzerUK getSenderUk() {
    if (isNotBlank(getSenderkennung())) {
      return new BenutzerUK(getSenderkennung(), /*TODO */ new MandantUK(SYSTEM_MANDANT_NUMMER));
    }

    return null;
  }

  public boolean hasUrspruenglicheNachricht() {
    return nonNull(getUrspruenglicheNachricht());
  }

  protected void preSetUrspruenglicheNachricht(Nachricht alterWert, Nachricht neuerWert) {
    // Do nothing
  }

  protected void postSetUrspruenglicheNachricht(Nachricht alterWert, Nachricht neuerWert) {
    if (nonNull(neuerWert)) {
      // Antworten pflegen keine Rollen!
      removeEmpfaengerRollen();

      // Antworten hängen immer an einer EINZIGEN GEMEINSAMEN ursprünglichen Nachricht!
      if (neuerWert.hasUrspruenglicheNachricht()) {
        setUrspruenglicheNachricht(neuerWert.getUrspruenglicheNachricht());
      }

      setEmpfaengerGruppeArt(NachrichtEmpfaengerGruppeArt.ANTWORT);
    } else {
      if (hasEmpfaengerRollen()) {
        setEmpfaengerGruppeArt(NachrichtEmpfaengerGruppeArt.ADRESSIERT);
      } else {
        setEmpfaengerGruppeArt(NachrichtEmpfaengerGruppeArt.ALLE);
      }
    }
  }

  public boolean hasEmpfaengerRollen() {
    return !getEmpfaengerRollen().isEmpty();
  }

  public Collection<Rolle> getEmpfaengerRollen() {
    return getRolles();
  }

  public void setEmpfaengerRollen(Collection<Rolle> rollen) {
    removeEmpfaengerRollen();

    rollen.forEach(rolle -> {
      if (nonNull(rolle)) {
        addEmpfaengerRolle(rolle);
      }
    });
  }

  public void addEmpfaengerRolle(Rolle rolle) {
    addRolle(rolle);

    setEmpfaengerGruppeArt(NachrichtEmpfaengerGruppeArt.ADRESSIERT);
  }

  public void removeEmpfaengerRollen() {
    removeAllRolles();

    setEmpfaengerGruppeArt(NachrichtEmpfaengerGruppeArt.ALLE);
  }
}
