
package de.ivu.elect.presentation;

import static java.util.Objects.nonNull;

import java.io.Serializable;
import java.util.Date;

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzort;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.system.boundary.SystemName;
import de.ivu.elect.business.system.boundary.SystemStatusStore;
import de.ivu.elect.business.system.entity.SystemStatus;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlOderWahltermin;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.UserLocale;

public class AppHeading implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Messages messages;

  @Inject
  private transient UserLocale userLocale;

  @Inject
  private transient SystemStatusStore systemStatusStore;

  @Inject
  private transient ElectCommonPrincipal electCommonPrincipal;

  @Inject
  private transient SystemName systemName;

  public AppHeading() {
    super();
  }

  protected String getSeparator() {
    return " | ";
  }

  public String formatHeading(Wahl wahl) {
    if (nonNull(wahl)) {
      return formatHeading(wahl, wahl.getWahldatum());
    }

    return formatHeading();
  }

  public String formatHeading(Wahltermin wahltermin) {
    if (nonNull(wahltermin)) {
      Date wahldatum = wahltermin.getWahldatum();

      if (wahltermin.isWahlhelferdatenbank()) {
        wahldatum = null;
      }

      return formatHeading(wahltermin, wahldatum);
    }

    return formatHeading();
  }

  protected String formatHeading() {
    return appendSystemInfos(getMessage("app.name.full"));
  }

  protected String formatHeading(WahlOderWahltermin wahlOrWahltermin, Date wahldatum) {

    String result = getWahlOderWahlterminName(wahlOrWahltermin);

    if (nonNull(wahldatum)) {
      result += " ";
      if (wahlOrWahltermin.isWahldatumNichtFestgelegt()) {
        result += wahlOrWahltermin.getWahljahr();
      } else {
        result += formatDate(wahldatum);
      }
    }

    result = appendWahlOderWahlterminInfos(wahlOrWahltermin, result);

    return appendSystemInfos(result);
  }

  protected String appendWahlOderWahlterminInfos(WahlOderWahltermin wahlOrWahltermin, String result) {
    return result;
  }

  protected String getWahlOderWahlterminName(WahlOderWahltermin wahlOrWahltermin) {
    return wahlOrWahltermin.getName();
  }

  protected String appendSystemInfos(String heading) {
    if (electCommonPrincipal.isLoggedIn()) {
      String result = getMessage("app.systemInfos.format", getSeparator(), heading, getMessage(getSystemStatus()), systemName.getSystemName());

      BenutzerEinsatzort einsatzort = electCommonPrincipal.getBenutzerEinsatzort();

      if (einsatzort != null) {
        result += getSeparator();
        result += einsatzort.getName();
      }

      return result;
    }
    return heading;
  }

  protected SystemStatus getSystemStatus() {
    return systemStatusStore.getSystemStatus(electCommonPrincipal.getMandant());
  }

  protected String getMessage(String key, Object... params) {
    return messages.getMessageForMessageKey(key, params);
  }

  protected String getMessage(Enum< ? > enumValue, Object... params) {
    return messages.lokalisiere(enumValue, params);
  }

  protected String formatDate(Date date) {
    return userLocale.formatDate(date);
  }
}
