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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;
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.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.NlKandidatur;
import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.business.wahlvorschlag.entity.NlListe;
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);
  }

  //ELECTVAPP-907
  public String formatKuerzenKandidaturNamenInDokument(Kandidatur kandidatur) {
    String result = formatKandidaturNachname(kandidatur);

    String initialen = formatKandidaturInitialen(new NlKandidatur(kandidatur));

    if (isNotBlank(initialen)) {
      if (isNotBlank(result)) {
        result += getMessageOrDefault(kandidatur, getSeparatorMsgKey());
      }

      result += initialen;
    }
    return result;
  }

  private String getSeparatorMsgKey() {
    return "StimmzettelFormatter.KandidaturVornameNachname.separator";
  }

  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, getSeparatorMsgKey());
      }

      result += vornamen;
    }

    String geschlechtFormatted = formatKandidaturGeschlechtKuerzel(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 += formatKandidaturInitialen(nlKandidatur);

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

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

      String geschlechtFormatted = formatKandidaturGeschlechtKuerzel(kandidatur, publishGenderIgnored);

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

    return trimToEmpty(result);
  }

  private String formatKandidaturInitialen(NlKandidatur nlKandidatur) {
    return trimToEmpty(nlKandidatur.getInitialen());
  }

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

      Geschlecht geschlecht = nlKandidatur.getGeschlecht();

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

        if (kandidatur.isListenkandidatur() && NlListe.isPublicationLanguageFriesisch(castTo(kandidatur, Listenkandidatur.class).getListe())) { // ELECTVAPP-1742
          msgKey += ".fy";
        }

        String geschlechtKuerzel = getMessageOrDefault(msgKey, "");

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

    return "";
  }
}
