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

import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.dokumente.boundary.DokumentVorlageExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.konfiguration.entity.KonfigurationExtendedLoader;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.system.entity.SystemGebietsebene;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractDokumentBulkExportSubViewFactory {

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  protected transient DokumentVorlageExtendedDAO dokumentVorlageExtendedDAO;

  @Inject
  protected transient WahlSessionSelector wahlSessionSelector;

  @Inject
  protected transient GebietSessionSelect gebietSessionSelect;

  @Inject
  protected transient KonfigurationExtendedLoader konfigurationExtendedLoader;

  protected AbstractDokumentBulkExportSubViewFactory() {
    super();
  }

  public List<AbstractDokumentBulkExportSubView< ? , ? , ? >> collectDokumentBulkExportSubViews(ElectCommonPrincipal principal) {
    if (principal != null && isWahlSelected()) {
      return collectDokumentBulkExportSubViewsSupported(getSelectedWahl()).stream() //
          .filter(exportSubView -> exportSubView.hasUseCasePermissions(principal) && exportSubView.isExportEnabled()) // ELECT-7256
          .collect(toList());
    }

    return emptyList();
  }

  protected abstract List<AbstractDokumentBulkExportSubView< ? , ? , ? >> collectDokumentBulkExportSubViewsSupported(Wahl wahl);

  protected boolean isWahlSelected() {
    return getSelectedWahl() != null;
  }

  protected Wahl getSelectedWahl() {
    Wahl wahl = wahlSessionSelector.getEntity();

    if (wahl == null) {
      Gebiet gebiet = getSelectedGebiet();

      if (gebiet != null) {
        wahl = gebiet.getWahl();
      }
    }

    return wahl;
  }

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

  protected Gebiet getSelectedGebiet() {
    return gebietSessionSelect.getEntity();
  }

  protected SystemGebietsebene getSystemGebietsebene() {
    if (isWahlSelected()) {
      try {
        SystemGebietsebene result = getSelectedWahl().getMandant().getSystemGebietsebene();

        if (result != null) {
          return result;
        }
      } catch (Exception ignored) {
      }
    }

    return SystemGebietsebene.UNBEKANNT;
  }

  protected boolean equalsGebietsart(Gebietsart gebietsart, String gebietsartNameOderTitel) {
    return equalsIgnoreCase(gebietsart.getName(), gebietsartNameOderTitel) || equalsIgnoreCase(gebietsart.getTitel(), gebietsartNameOderTitel);
  }

  protected String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  protected String getMessage(Enum< ? > enumValue) {
    return getMessages().lokalisiere(enumValue);
  }

  protected Messages getMessages() {
    return messages;
  }
}
