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

import static org.apache.commons.lang3.StringUtils.endsWith;
import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;
import static org.apache.commons.lang3.StringUtils.isNoneBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.NlKandidatur;
import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.jee.faces.Messages;

@Specializes // ELECT-9644
public class NlStimmzettelFormatter extends StimmzettelFormatter {

  private static final long serialVersionUID = 1L;

  public NlStimmzettelFormatter() {
    super();
  }

  public NlStimmzettelFormatter(Messages messages) {
    super(messages);
  }

  @Override
  public String getKandidaturNamePraesentation(Kandidatur kandidatur) {
    return formatKandidaturNamenInAnwendung(kandidatur);
  }

  // ELECT-11588
  public String formatKandidaturNamenInAnwendung(Kandidatur kandidatur) {
    return formatKandidaturNamen(kandidatur, true);
  }

  // ELECT-11588
  public String formatKandidaturNamenInDokument(Kandidatur kandidatur) {
    return formatKandidaturNamen(kandidatur, false);
  }

  private String formatKandidaturNamen(Kandidatur kandidatur, boolean publishGenderIgnored) {
    if (kandidatur == null) {
      return "";
    }

    String result = formatKandidaturNachname(kandidatur);

    String vornamen = formatKandidaturVornamen(kandidatur, publishGenderIgnored);

    if (isNotBlank(vornamen)) {
      if (isNotBlank(result)) {
        result += getMessageOrDefault(kandidatur, "StimmzettelFormatter.KandidaturVornameNachname.separator");
      }

      result += vornamen;
    }

    String geschlechtFormatted = formatKandidaturGeschlecht(kandidatur, publishGenderIgnored);

    if (isNoneBlank(result, geschlechtFormatted) && !endsWith(result, geschlechtFormatted)) {
      result += " ";
      result += geschlechtFormatted;
    }

    return trimToEmpty(result);
  }

  @Override
  public String formatKandidaturVornamen(Kandidatur kandidatur) {
    return formatKandidaturVornamenInAnwendung(kandidatur);
  }

  // ELECT-11588
  public String formatKandidaturVornamenInAnwendung(Kandidatur kandidatur) {
    return formatKandidaturVornamen(kandidatur, true);
  }

  // ELECT-11588
  public String formatKandidaturVornamenInDokument(Kandidatur kandidatur) {
    return formatKandidaturVornamen(kandidatur, false);
  }

  private String formatKandidaturVornamen(Kandidatur kandidatur, boolean publishGenderIgnored) {
    String result = "";

    if (kandidatur != null) {
      NlKandidatur nlKandidatur = new NlKandidatur(kandidatur);

      result += trimToEmpty(nlKandidatur.getInitialen());

      String vorname = trimToEmpty(nlKandidatur.getVorname());

      if (isNotBlank(vorname) && !equalsIgnoreCase(result, vorname)) {
        if (isNotBlank(result)) {
          result += " (" + vorname + ")";
        } else {
          result += vorname;
        }
      }

      String geschlechtFormatted = formatKandidaturGeschlecht(kandidatur, publishGenderIgnored);

      if (isNoneBlank(result, geschlechtFormatted)) {
        result += " ";
        result += geschlechtFormatted;
      }
    }

    return trimToEmpty(result);
  }

  private String formatKandidaturGeschlecht(Kandidatur kandidatur, boolean publishGenderIgnored) {
    if (kandidatur != null) {
      NlKandidatur nlKandidatur = new NlKandidatur(kandidatur);

      Geschlecht geschlecht = nlKandidatur.getGeschlecht();

      if (geschlecht != null && (publishGenderIgnored || nlKandidatur.isPublishGender())) {
        String geschlechtKuerzel = getMessageOrDefault("Geschlecht." + geschlecht + ".kuerzel", "");

        if (isNotBlank(geschlechtKuerzel)) {
          return "(" + geschlechtKuerzel + ")";
        }
      }
    }

    return "";
  }
}
