package de.ivu.elect.presentation.email.form;

import de.ivu.elect.business.email.entity.EmailConstants;
import de.ivu.elect.business.email.entity.EmailVorgang;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;
import de.ivu.elect.presentation.person.PersonendatenFormatter;

import java.util.ArrayList;
import java.util.List;

public class EmailVorgangEmpfaengerPersonendatenProperty extends AbstractStringProperty {

  private static final int MAX_DARGESTELLTE_PERSONEN = 2;

  private static final String PERSONEN_SEPARATOR = ", ";

  private final EmailVorgang entity;

  private final PersonendatenFormatter personendatenFormatter;

  public EmailVorgangEmpfaengerPersonendatenProperty(EmailVorgang entity, PersonendatenFormatter personendatenFormatter) {
    super();
    this.entity = entity;
    this.personendatenFormatter = personendatenFormatter;
  }

  @Override
  public String getValue() {
    if (entity.getEmpfaengerPersonendaten() == null) {
      return null;
    }

    StringBuilder sb = new StringBuilder();

    List<Personendaten> personenMitEmailAdresse = entity.getEmpfaengerPersonendatenMitEmailAdresse();

    String erstePersonenDarstellung = getErstePersonenDarstellung(personenMitEmailAdresse, MAX_DARGESTELLTE_PERSONEN);

    appendPersonenDarstellung(sb, erstePersonenDarstellung, personenMitEmailAdresse.size());
    appendHinweisPersonenOhneEmailAdresse(sb, personenMitEmailAdresse.size());

    if (entity.getEmpfaengerPersonendaten().size() == 1 && personenMitEmailAdresse.size() == 1) {
      appendEmailAdresse(sb, personenMitEmailAdresse.get(0));
    }

    return sb.toString();
  }

  private String getErstePersonenDarstellung(List<Personendaten> personendatenListe, int maxDargestelltePersonen) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < maxDargestelltePersonen && i < personendatenListe.size(); i++) {
      if (i > 0) {
        sb.append(PERSONEN_SEPARATOR);
      }
      sb.append(personendatenFormatter.getVornameUndFamiliennameFuerAnzeige(personendatenListe.get(i)));
    }
    return sb.toString();
  }

  private void appendPersonenDarstellung(StringBuilder sb, String erstePersonenDarstellung, int anzahlPersonenMitEmailAdresse) {
    int anzahlWeiterePersonen = anzahlPersonenMitEmailAdresse - MAX_DARGESTELLTE_PERSONEN;
    if (anzahlWeiterePersonen <= 0) {
      sb.append(erstePersonenDarstellung);
    }
    if (anzahlWeiterePersonen == 1) {
      sb.append(getMessage("email.vorgang.create.empfaenger.personendaten.value.ez",
          erstePersonenDarstellung, anzahlWeiterePersonen));
    }
    if (anzahlWeiterePersonen > 1) {
      sb.append(getMessage("email.vorgang.create.empfaenger.personendaten.value.mz",
          erstePersonenDarstellung, anzahlWeiterePersonen));
    }
  }

  private void appendHinweisPersonenOhneEmailAdresse(StringBuilder sb, int anzahlPersonenMitEmailAdresse) {
    int anzahlPersonenOhneEmailAdresse = entity.getAnzahlEmpfaengerPersonendaten() - anzahlPersonenMitEmailAdresse;
    if (anzahlPersonenOhneEmailAdresse > 0 && sb.length() > 0) {
      sb.append(" ");
    }
    if (anzahlPersonenOhneEmailAdresse == 1) {
      sb.append(getMessage("email.vorgang.create.empfaenger.personendaten.zusatz.ohne.email.ez", anzahlPersonenOhneEmailAdresse));
    }
    if (anzahlPersonenOhneEmailAdresse > 1) {
      sb.append(getMessage("email.vorgang.create.empfaenger.personendaten.zusatz.ohne.email.mz", anzahlPersonenOhneEmailAdresse));
    }
  }

  private void appendEmailAdresse(StringBuilder sb, Personendaten personendaten) {
    sb.append(" <");
    boolean first = true;
    for (String emailAdresse : personendaten.getEmailAdressenZumVersenden()) {
      if (first) {
        first = false;
      } else {
        sb.append("; ");
      }
      sb.append(emailAdresse);
    }
    sb.append(">");
  }

  @Override
  public void setValue(String s) {
    // Do nothing
  }

  @Override
  public int getDefaultMaxLength() {
    return 255;
  }

  @Override
  public String getDefaultLabel() {
    return getMessage(EmailConstants.MESSAGE_KEY_EMPFAENGER_EINZAHL);
  }

  @Override
  public boolean getDefaultRequired() {
    return true;
  }

  @Override
  public boolean isReadonly() {
    return true;
  }
}
