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

import static java.util.Arrays.asList;
import static java.util.Collections.sort;
import static java.util.stream.Collectors.toList;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.jee.faces.Messages;

public class PaginationDefaultView implements Serializable {

  private static final long serialVersionUID = 1L;

  private static final List<Integer> PAGE_SIZE_DEFAULTS = asList(5, 10, 25, 50, 100, 200);

  private static final double PAGE_SIZE_LAZY_FACTOR = 1.1d;

  private static final String PAGINATOR_TEMPLATE_DEFAULT = "{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown} {MyContent}";

  private static final String PAGINATOR_TEMPLATE_NONE = "{CurrentPageReport} {MyContent}";

  @Inject
  private transient Messages messages;

  @Inject
  private transient PaginationDefaultSizeFactory paginationDefaultSizeFactory;

  public PaginationDefaultView() {
    super();
  }

  public int getPageSizeConfigured(int resultSize) {
    if (isShowPaginator(resultSize)) {
      return paginationDefaultSizeFactory.getDefaultPageSize();
    }

    return getPageSizeDefaultsShowAll();
  }

  public int getPageSizeDefaultsMin() {
    return PAGE_SIZE_DEFAULTS.get(0);
  }

  public int getPageSizeDefaultsMax() {
    return PAGE_SIZE_DEFAULTS.get(PAGE_SIZE_DEFAULTS.size() - 1);
  }

  public int getPageSizeDefaultsShowAll() {
    return Integer.MAX_VALUE;
  }

  public double getPageSizeLazyFactor() {
    return PAGE_SIZE_LAZY_FACTOR;
  }

  public String getAnzahlTrefferLabel(int resultSize) {
    return messages.getMessageForMessageKey("component.paginator.anzahl.treffer", resultSize);
  }

  public int getRows(int resultSize, int pageSize) {
    if (isPaginator(resultSize, pageSize)) {
      return pageSize;
    }

    return Math.max(resultSize, pageSize);
  }

  public String getRowsPerPageTemplate(int resultSize, int pageSize) {
    List<Integer> pageSizes = PAGE_SIZE_DEFAULTS.stream() //
        .filter(value -> value >= pageSize) // ELECT-6508
        .collect(toList());

    if (!pageSizes.contains(pageSize) && pageSize != getPageSizeDefaultsShowAll()) {
      pageSizes.add(pageSize);
    }

    sort(pageSizes);

    return StringUtils.join(pageSizes, ",");
  }

  public boolean isShowPaginator(int resultSize) {
    return resultSize > 0;
  }

  public boolean isPaginator(int resultSize, int pageSize) {
    return resultSize > pageSize * getPageSizeLazyFactor();
  }

  public String getPaginatorTemplate(int resultSize, int pageSize) {
    if (isPaginator(resultSize, pageSize)) {
      return PAGINATOR_TEMPLATE_DEFAULT;
    }

    return PAGINATOR_TEMPLATE_NONE;
  }

  public String getPaginatorPosition(int resultSize, int pageSize) {
    if (isPaginator(resultSize, pageSize)) {
      return "both";
    }

    return "bottom";
  }
}
