
package de.ivu.elect.presentation.ergebnis;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Named;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.ErgebnisProperties;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.AbstractTimestampProperty;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.PropertyType;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.KeineOnlineHilfe;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId(KeineOnlineHilfe.KEINE_ONLINE_HILFE)
@Named(VorperiodeDatumFestlegenView.COMPONENT_NAME)
@View(viewId = VorperiodeDatumFestlegenView.VIEW_ID, useCase = UseCasePermission.ERGEBNIS_EDIT)
public class VorperiodeDatumFestlegenView extends ErgebnisEditView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "vorperiodeDatumFestlegenView";

  public static final String VIEW_ID = "/ergebnis/vorperiode-datum-festlegen.xhtml";

  protected static final String PARENT_VIEW_ID = "/ergebnis/ergebnis-status.xhtml";

  public VorperiodeDatumFestlegenView() {
    super();
  }

  @Override
  @PreConditionCheck
  public String checkPreCondition() {
    if (getEntity() == null) {
      return cancel();
    }

    return null;
  }

  @PostConstruct
  public void init() {
    List<Ergebnis> vorperiodenergebnisseDerWahl = extendedDAO.findByWahlAndErgebnisart(getSelectedWahl(), Ergebnisart.VORPERIODE);

    if (vorperiodenergebnisseDerWahl.size() != 1) {
      throw new IllegalStateException(
          "Es muss genau ein Vorperiodenergebnis zur ausgweählten Wahl existieren. Vorperiodenergebnisse gefunden: "
              + vorperiodenergebnisseDerWahl.size());
    }

    setEntity(vorperiodenergebnisseDerWahl.get(0));
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Ergebnis ergebnis) {
    ErgebnisProperties properties = ergebnis.getProperties();

    AbstractTimestampProperty zeitstempelProperty = properties.getZeitstempelProperty();
    zeitstempelProperty.setType(PropertyType.INPUT_CALENDAR);
    zeitstempelProperty.setLabel(getMessage("vorperiode.datum.festlegen.label.datum"));
    formBuilder.addProperty(zeitstempelProperty);
  }

  @Override
  protected void addMessageSaveSuccess(Ergebnis entity) {
    addInfoMessage("vorperiode.datum.festlegen.action.save.success.message");
  }

  @Override
  public String getViewId() {
    return VIEW_ID;
  }

  @Override
  public String getParentViewId() {
    return PARENT_VIEW_ID;
  }
}
