
package de.ivu.elect.presentation.search.menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.search.boundary.BenutzerSuchparameterSearch;
import de.ivu.elect.business.search.entity.BenutzerSuchparameter;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
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.FacesContextUtil;
import de.ivu.elect.jee.presentation.menu.AbstractMenuModelBuilder;
import de.ivu.elect.jee.presentation.menu.MenuEntry;
import de.ivu.elect.jee.presentation.menu.SeparatorMenuEntry;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry01;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry02;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry03;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry04;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry05;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry06;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry07;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry08;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry09;
import de.ivu.elect.presentation.search.menu.AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry.BenutzerSuchparameterAuswaehlenMenuItemEntry10;

public class BenutzerSuchparameterOptionenMenu extends AbstractMenuModelBuilder {

  private static final long serialVersionUID = 1L;

  public static final int ANZAHL_BENUTZER_SUCHPARAMETER_LIMIT = 10; // Cf. BenutzerSuchparameterAuswaehlenMenuItemEntry01 ... BenutzerSuchparameterAuswaehlenMenuItemEntry10

  @Inject
  private transient ElectCommonPrincipal principal;

  @Inject
  private transient BenutzerSuchparameterSearch benutzerSuchparameterSearch;

  @Inject
  private transient BenutzerSuchparameterCreateAlsDefaultMenuItemEntry benutzerSuchparameterCreateAlsDefaultMenuItemEntry;

  @Inject
  private transient BenutzerSuchparameterCreateMenuItemEntry benutzerSuchparameterCreateMenuItemEntry;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry01 benutzerSuchparameterAuswaehlenMenuItemEntry01;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry02 benutzerSuchparameterAuswaehlenMenuItemEntry02;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry03 benutzerSuchparameterAuswaehlenMenuItemEntry03;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry04 benutzerSuchparameterAuswaehlenMenuItemEntry04;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry05 benutzerSuchparameterAuswaehlenMenuItemEntry05;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry06 benutzerSuchparameterAuswaehlenMenuItemEntry06;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry07 benutzerSuchparameterAuswaehlenMenuItemEntry07;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry08 benutzerSuchparameterAuswaehlenMenuItemEntry08;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry09 benutzerSuchparameterAuswaehlenMenuItemEntry09;

  @Inject
  private transient BenutzerSuchparameterAuswaehlenMenuItemEntry10 benutzerSuchparameterAuswaehlenMenuItemEntry10;

  @Inject
  private transient WahlSessionSelector wahlSelect;

  @Inject
  private transient WahlterminSessionSelect wahlterminSelect;

  @Inject
  private transient SeparatorMenuEntry separator;

  @Inject
  private transient BenutzerSuchparameterSearchMenuItemEntry benutzerSuchparameterSearchMenuItemEntry;

  public BenutzerSuchparameterOptionenMenu() {
    super();
  }

  @Override
  protected List<MenuEntry> getMenuEntriesSorted() {
    if (isWahlSelected() || isWahlterminSelected()) {
      List<MenuEntry> result = new ArrayList<>();

      appendBenutzerSuchparameter(result);

      if (!result.isEmpty()) {
        result.add(separator);
      }

      result.add(benutzerSuchparameterCreateAlsDefaultMenuItemEntry);
      result.add(benutzerSuchparameterCreateMenuItemEntry);
      result.add(benutzerSuchparameterSearchMenuItemEntry);

      return result;
    }

    return Collections.emptyList();
  }

  private void appendBenutzerSuchparameter(List<MenuEntry> result) {
    int count = 0;

    for (BenutzerSuchparameter benutzerSuchparameter : collectBenutzerSuchparameter()) {
      count++;

      append(result, count, benutzerSuchparameter);
    }
  }

  private void append(List<MenuEntry> result, int count, BenutzerSuchparameter benutzerSuchparameter) {
    AbstractBenutzerSuchparameterAuswaehlenMenuItemEntry benutzerSuchparameterAuswaehlenMenuItemEntry = null;

    switch (count) {
      case 1 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry01;
        break;
      case 2 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry02;
        break;
      case 3 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry03;
        break;
      case 4 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry04;
        break;
      case 5 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry05;
        break;
      case 6 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry06;
        break;
      case 7 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry07;
        break;
      case 8 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry08;
        break;
      case 9 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry09;
        break;
      case 10 :
        benutzerSuchparameterAuswaehlenMenuItemEntry = benutzerSuchparameterAuswaehlenMenuItemEntry10;
        break;
    }

    if (benutzerSuchparameterAuswaehlenMenuItemEntry != null) {
      benutzerSuchparameterAuswaehlenMenuItemEntry.setBenutzerSuchparameter(benutzerSuchparameter);

      result.add(benutzerSuchparameterAuswaehlenMenuItemEntry);
    }
  }

  private List<BenutzerSuchparameter> collectBenutzerSuchparameter() {
    if (!isWahlSelected() && !isWahlterminSelected()) {
      return Collections.emptyList();
    }

    String viewId = FacesContextUtil.getCurrentViewId();

    if (StringUtils.isBlank(viewId)) {
      return Collections.emptyList();
    }

    return benutzerSuchparameterSearch.getSearchResult(getSelectedWahltermin(), getSelectedWahl(), getSelectedBenutzerKennung(), viewId);
  }

  private Wahl getSelectedWahl() {
    return wahlSelect.getEntity();
  }

  private boolean isWahlSelected() {
    return wahlSelect.isSelected();
  }

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

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

  private String getSelectedBenutzerKennung() {
    return principal.getLogin().getBenutzerkennung();
  }
}
