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

import static java.util.Collections.emptyList;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.internet.boundary.InternetSeiteExtendedDAO;
import de.ivu.elect.business.internet.entity.InternetSeite;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.jee.presentation.menu.MenuEntry;

@Specializes
public class WasPraesentationPageMenu extends PraesentationPageMenu {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen1MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen2MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen3MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen4MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen5MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen6MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen7MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen8MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen9MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen10MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen11MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen12MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen13MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen14MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen15MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen16MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen17MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen18MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen19MenuItemEntry;

  @Inject
  private transient InternetSeiteOeffnen1MenuItemEntry internetSeiteOeffnen20MenuItemEntry;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  private transient InternetSeiteExtendedDAO internetSeiteExtendedDAO;

  @Override
  protected List<MenuEntry> getMenuEntriesSorted() {
    List<MenuEntry> result = new ArrayList<>(super.getMenuEntriesSorted());

    result.add(separator);

    List<InternetSeite> seiten = new ArrayList<>(bestimmeSeiten());

    add(result, seiten, internetSeiteOeffnen1MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen2MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen3MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen4MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen5MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen6MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen7MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen8MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen9MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen10MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen11MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen12MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen13MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen14MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen15MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen16MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen17MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen18MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen19MenuItemEntry);
    add(result, seiten, internetSeiteOeffnen20MenuItemEntry);

    return result;
  }

  private List<InternetSeite> bestimmeSeiten() {
    if (wahlSessionSelect.isSelected()) {
      return internetSeiteExtendedDAO.findByWahl(wahlSessionSelect.getEntity()).stream() //
          .filter(internetSeite -> internetSeite.getStatus().isAktiv()) //
          .sorted(Comparator.comparing(InternetSeite::getPosition)) //
          .collect(Collectors.toList());
    }

    return emptyList();
  }

  private void add(List<MenuEntry> result, List<InternetSeite> seiten, AbstractInternetSeiteOeffnenMenuItemEntry entry) {
    if (seiten.isEmpty()) {
      entry.setInternetSeitePK(null);

      return;
    }

    InternetSeite internetSeite = seiten.remove(0);
    entry.setInternetSeitePK(internetSeite.getPk());

    result.add(entry);
  }

  public static class InternetSeiteOeffnen1MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen2MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen3MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen4MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen5MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen6MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen7MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen8MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen9MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen10MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen11MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen12MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen13MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen14MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen15MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen16MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen17MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen18MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen19MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }

  public static class InternetSeiteOeffnen20MenuItemEntry extends AbstractInternetSeiteOeffnenMenuItemEntry {

    private static final long serialVersionUID = 1L;
  }
}
