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

import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import javax.persistence.NoResultException;

import com.querydsl.core.NonUniqueResultException;

import de.ivu.elect.business.benutzerverwaltung.boundary.AbstractBenutzerDAO;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtProperties.SenderkennungProperty;
import de.ivu.elect.presentation.person.PersonendatenFormatter;

public class NachrichtSenderProperty extends SenderkennungProperty {

  private final AbstractBenutzerDAO benutzerDao;

  private final PersonendatenFormatter personendatenFormatter;

  public NachrichtSenderProperty(Nachricht nachricht, AbstractBenutzerDAO benutzerDao, PersonendatenFormatter personendatenFormatter) {
    super(nachricht);

    this.benutzerDao = benutzerDao;
    this.personendatenFormatter = personendatenFormatter;
  }

  @Override
  public String getLabel() {
    return getMessage("entity.einzahl.NACHRICHT.SENDER");
  }

  @Override
  public String getValue() {
    return formatSender(entity, benutzerDao, personendatenFormatter);
  }

  public static String formatSender(Nachricht nachricht, AbstractBenutzerDAO benutzerDao, PersonendatenFormatter personendatenFormatter) {
    try {
      return formatSender(benutzerDao.findByUK(nachricht.getSenderUk()), personendatenFormatter);
    } catch (NonUniqueResultException | NoResultException ignored) {
      // Benutzer gelöscht, Benutzerkennung geändert, Benutzer.SYSTEM als Sender, ...
    }

    return nachricht.getSenderkennung();
  }

  private static String formatSender(Benutzer benutzer, PersonendatenFormatter personendatenFormatter) {
    String benutzerkennung = benutzer.getBenutzerkennung();
    String nameFormatted = personendatenFormatter.getVornameUndFamiliennameFuerAnzeige(benutzer.getVorname(), benutzer.getFamilienname());

    if (isNotBlank(nameFormatted)) {
      return trimToEmpty(nameFormatted + " (" + benutzerkennung + ")");
    }

    return benutzerkennung;
  }
}
