
package de.ivu.elect.presentation;

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

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.gebietsbaum.SetzeWurzelgebietSelectChangeListener;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;


import static java.util.Objects.isNull;

@RequestScoped
@Named(LayoutComponentsContext.COMPONENT_NAME)
public class LayoutComponentsContext implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "layoutComponentsContext";

  @Inject
  private transient WahlterminSessionSelect wahlterminSelect;

  @Inject
  private transient AppLogo appLogo;

  @Inject
  private transient AppHeading appHeading;

  @Inject
  private transient UserLocale userLocale;

  @Inject
  private transient Messages messages;

  @Inject
  protected transient GebietSessionSelect gebietSessionSelect;

  @Inject
  protected transient GebietNummerFormatter gebietNummerFormatter;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  @Inject
  private transient SetzeWurzelgebietSelectChangeListener setzeWurzelgebietSelectChangeListener;

  private transient String subcontextName;

  @PostConstruct
  public void init(){
    // ELECT-8130
    setzeWurzelgebietSelectChangeListener.aktualisierWurzelgebietWennNotwendig();
  }

  public LayoutComponentsContext() {
    super();
  }

  public void checkEntitySelected() {
    if (!isWahlterminSelected()) {
      addInfoMessage("wahltermin.search.message.no.wahl.selected");
    }
  }

  private boolean isWahlterminSelected() {
    return wahlterminSelect.isSelected();
  }

  private Wahltermin getSelectedWahltermin() {
    return wahlterminSelect.getEntity();
  }

  public String getHeading() {
    return formatHeading(getSelectedWahltermin());
  }

  public String getFarbe() {
    if (!isWahlterminSelected()) {
      return null;
    }

    return getSelectedWahltermin().getFarbe();
  }

  public boolean isSelected() {
    return isWahlterminSelected();
  }

  public boolean isFarbeImTabVerwenden() {
    return !isFarbeImTabDeaktiviert() && isSelected() && StringUtils.isNotBlank(getFarbe()) ;
  }

  protected boolean isFarbeImTabDeaktiviert() {
    return Boolean.TRUE.toString().equalsIgnoreCase(System.getProperty("ivu.elect.farbe.tab.disabled"));
  }

  public String getLogoUrlString() {
    return appLogo.getUrlString();
  }

  public String getLogoFarbe() {
    return appLogo.getFarbe();
  }

  protected String formatHeading(Wahl wahl) {
    return appHeading.formatHeading(wahl);
  }

  protected String formatHeading(Wahltermin wahltermin) {
    return appHeading.formatHeading(wahltermin);
  }

  public boolean isSubcontextPresent() {
    if (isCustomerMandant()) {
      return isCustomerSubcontextPresent();
    }
    return true;
  }

  protected boolean isCustomerSubcontextPresent() {
    return gebietSessionSelect.isSelected();
  }

  private boolean isCustomerMandant() {
    return getMandant() == null || getMandant().getArt().isCustomerMandant();
  }

  private transient Mandant mandant;

  private Mandant getMandant() {
    if (mandant == null) {
      mandant = mandantSessionSelect.getMandant();
    }
    return mandant;
  }

  public String getSubcontextName() {
    if (!isSubcontextPresent()) {
      return "";
    }
    if (isCustomerMandant()) {
      if (isNull(subcontextName)) {
        subcontextName = buildSubcontextName();
      }

      return subcontextName;
    }
    return getMessage("page.title.system.mandant");
  }

  protected String buildSubcontextName() {
    return buildSubContextSelectedGebiet();
  }

  protected String buildSubContextSelectedGebiet() {
    if (gebietSessionSelect.isSelected()) {
      return gebietNummerFormatter.getDarstellung(gebietSessionSelect.getEntity());
    }
    return "";
  }

  protected String getMessage(Enum<?> value) {
    return messages.lokalisiere(value);
  }

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

  protected void addInfoMessage(String msgKey, Object... params) {
    messages.addInfoMessage(msgKey, params);
  }

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

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

  public String getSubTitle() {
    if (isCustomerMandant()) {
      return getWahlWahlterminName();
    }

    return getMessage("page.title.system.mandant");
  }

  public String getWahlWahlterminName() {
    if (!isWahlterminSelected()) {
      return getMessage("page.title.ohne.wahltermin");
    }
    return getSelectedWahltermin().getName();
  }

  public String getExtraHtmlStyleClass(){
    return "default";
  }
}
