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

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.presentation.person.PersonendatenFormatter;
import org.apache.commons.lang3.StringEscapeUtils;

import java.util.Objects;

public enum EmailVorgangPlatzhalter {

  ANREDE_FORMEL("ANREDE") {
    @Override
    public String getErlaeuterung(Messages messages) {
      return messages.getMessageForMessageKey("email.vorlage.create.platzhalter.anrede.formel.erlaeuterung");
    }

    @Override
    public String getErsetzung(Personendaten personendaten, PersonendatenFormatter personendatenFormatter) {
      return personendatenFormatter.bestimmeAnredeFormel(personendaten);
    }
  },

  TITEL_NACHNAME("NAME") {
    @Override
    public String getErlaeuterung(Messages messages) {
      return messages.getMessageForMessageKey("email.vorlage.create.platzhalter.titel.nachname.erlaeuterung");
    }

    @Override
    public String getErsetzung(Personendaten personendaten, PersonendatenFormatter personendatenFormatter) {
      if (personendaten == null) {
        return "";
      }
      return personendatenFormatter.bestimmeTitelNamensbestandteileUndNachname(personendaten.getTitel(), personendaten.getFamiliennameBestandteil(), personendaten.getFamilienname());
    }
  },

  TITEL_VORNAME_NACHNAME("NAME_KOMPLETT") {
    @Override
    public String getErlaeuterung(Messages messages) {
      return messages.getMessageForMessageKey("email.vorlage.create.platzhalter.titel.vorname.nachname.erlaeuterung");
    }

    @Override
    public String getErsetzung(Personendaten personendaten, PersonendatenFormatter personendatenFormatter) {
      if (personendaten == null) {
        return "";
      }
      return personendatenFormatter.bestimmeTitelVornameNamensbestandteileUndNachname(
          personendaten.getTitel(), personendaten.getRufname(), personendaten.getFamiliennameBestandteil(), personendaten.getFamilienname());
    }
  },

  VORNAME("VORNAME") {
    @Override
    public String getErlaeuterung(Messages messages) {
      return messages.getMessageForMessageKey("email.vorlage.create.platzhalter.vorname.erlaeuterung");
    }

    @Override
    public String getErsetzung(Personendaten personendaten, PersonendatenFormatter personendatenFormatter) {
      if (personendaten == null) {
        return "";
      }
      return personendatenFormatter.getVornameAnzeige(personendaten.getRufname(),
          personendaten.getVornamen());
    }
  };

  private final String platzhalterName;

  private EmailVorgangPlatzhalter(String platzhalterName) {
    this.platzhalterName = platzhalterName;
  }

  public String getPlatzhalter() {
    StringBuilder sb = new StringBuilder();
    sb.append("[[");
    sb.append(platzhalterName);
    sb.append("]]");
    return sb.toString();
  }

  public abstract String getErlaeuterung(Messages messages);

  public abstract String getErsetzung(Personendaten personendaten, PersonendatenFormatter personendatenFormatter);

  public static String ersetzeAllePlatzhalter(String inhaltMitPlatzhaltern, Personendaten personendaten,
      PersonendatenFormatter personendatenFormatter) {

    String inhaltMitErsetztenPlatzhaltern = Objects.toString(inhaltMitPlatzhaltern, "");

    for (EmailVorgangPlatzhalter emailVorgangPlatzhalter : values()) {
      String platzhalter = emailVorgangPlatzhalter.getPlatzhalter();
      String ersetzung = StringEscapeUtils.escapeHtml4(Objects.toString(emailVorgangPlatzhalter.getErsetzung(personendaten, personendatenFormatter), ""));
      inhaltMitErsetztenPlatzhaltern = inhaltMitErsetztenPlatzhaltern.replace(platzhalter, ersetzung);
    }

    return inhaltMitErsetztenPlatzhaltern;
  }

  public static String getCKEditorPlaceholderItems(Messages messages) {
    StringBuilder sb = new StringBuilder();
    sb.append("[ ");
    boolean first = true;
    for (EmailVorgangPlatzhalter emailVorgangPlatzhalter : values()) {
      if (first) {
        first = false;
      } else {
        sb.append(", ");
      }
      sb.append("['");
      sb.append(emailVorgangPlatzhalter.getErlaeuterung(messages));
      sb.append("', '");
      sb.append(emailVorgangPlatzhalter.platzhalterName);
      sb.append("']");
    }
    sb.append(" ]");
    return sb.toString();
  }
}
