
package de.ivu.elect.presentation.wahl.exchange;

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.gebietsbaum.boundary.GebietsartExtendedDAO;
import de.ivu.elect.business.konfiguration.entity.KonfigurationExtendedLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.system.entity.SystemGebietsebene;
import de.ivu.elect.business.wahl.boundary.WahlExtendedDAO;
import de.ivu.elect.business.wahl.boundary.WahlartExtendedDAO;
import de.ivu.elect.business.wahl.control.WahlImportObject;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlImportContext;
import de.ivu.elect.business.wahl.entity.WahlterminConstants;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaStringProperty;
import de.ivu.elect.jee.presentation.dynamicform.LambdaDateProperty;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.exchange.AbstractImportBestaetigenView;
import de.ivu.elect.presentation.exchange.ImportDescription;
import de.ivu.elect.presentation.wahl.action.WahlZurBearbeitungAuswaehlenAction;

@Named(AbstractWahlImportBestaetigenView.COMPONENT_NAME)
@View(viewId = AbstractWahlImportBestaetigenView.VIEW_ID, useCase = UseCasePermission.WAHL_IMPORTIEREN)
public abstract class AbstractWahlImportBestaetigenView extends AbstractImportBestaetigenView<WahlImportObject, WahlImportContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlImportBestaetigenView";

  public static final String VIEW_ID = "/wahl/wahl-import-bestaetigen.xhtml";

  @Inject
  private transient WahlExtendedDAO wahlExtendedDAO;

  @Inject
  private transient WahlartExtendedDAO wahlartExtendedDAO;

  @Inject
  private transient GebietsartExtendedDAO gebietsartExtendedDAO;

  @Inject
  private transient KonfigurationExtendedLoader konfigurationExtendedLoader;

  @Inject
  private transient WahlImportDescription importDescription;

  @Inject
  private transient WahlZurBearbeitungAuswaehlenAction wahlZurBearbeitungAuswaehlenAction;

  private WahlImportContext wahlImportContext;

  public AbstractWahlImportBestaetigenView() {
    super();
  }

  @Override
  protected void addProperties(FormBuilder formBuilder, DateiImport dateiImport, WahlImportContext context) {
    formBuilder.withId("wahlImportBestaetigen");
    addNeuesDatumNummmerProperties(formBuilder);
    super.addProperties(formBuilder, dateiImport, context);
  }

  protected void addNeuesDatumNummmerProperties(FormBuilder formBuilder) {
    formBuilder.addProperty(new LambdaDateProperty(getMessage("wahl.import.neues.datum"), false, getContext()::setNeuesDatum, getContext()::getNeuesDatum)).withKey("neuesDatum");
    formBuilder.addProperty(new LambdaStringProperty(getMessage("wahl.import.neue.nummer"), false, getContext()::setNeueNummer, getContext()::getNeueNummer, 0, WahlterminConstants.NUMMER_MAX_LENGTH)).withKey("neueNummer");
  }

  @Override
  protected WahlImportContext getContext() {
    if (wahlImportContext == null) {
      Mandant mandant = getMandant();

      wahlImportContext = new WahlImportContext(mandant, getSystemGebietsebene(mandant), wahlartExtendedDAO, gebietsartExtendedDAO);
    }

    return wahlImportContext;
  }

  private SystemGebietsebene getSystemGebietsebene(Mandant mandant) {
    return mandant.getSystemGebietsebene();
  }

  @Override
  protected ImportDescription getImportDescription() {
    return importDescription;
  }

  @Override
  @Redirect
  public String importieren() {
    String result = super.importieren();

    Wahl wahl = wahlExtendedDAO.findByPrimaryKey(getContext().getWahlPK());

    if (wahl != null && wahlZurBearbeitungAuswaehlenAction.isActionPossible(wahl)) {
      DateiImport datei = getSelectedEntity();

      wahlSelect.setEntity(wahl);
      dateiImportSelect.setEntity(datei); // Wird beim Wechseln der Wahl gelöscht => wiederherstellen

      addInfoMessage("wahl.edit.action.select.success.message", wahl.getName());
      return getImportErfolgtViewId();
    }

    return result;
  }
}
