var app = angular.module('myApp.services', []);

app.factory('Paginator', function() {
  // Wprawdzie to jest wzorzec factory, ale użytkownik usługi otrzymuje nowy
  // obiekt Paginator w trakcie każdego wywołania usługi. Wynika to z faktu
  // zwrócenia funkcji, która po wywołaniu dostarcza obiekt.
  return function(fetchFunction, pageSize) {
    pageSize = pageSize || 10;
    var paginator = {
      hasNextVar: false,
      next: function() {
        if (this.hasNextVar) {
          this.currentOffset += pageSize;
          this._load();
        }
      },
      _load: function() {
        var self = this;
        fetchFunction(this.currentOffset, pageSize + 1, function(items) {
          self.currentPageItems = items.slice(0, pageSize);
          self.hasNextVar = items.length === pageSize + 1;
        });
      },
      hasNext: function() {
        return this.hasNextVar;
      },
      previous: function() {
        if(this.hasPrevious()) {
          this.currentOffset -= pageSize;
          this._load();
        }
      },
      hasPrevious: function() {
        return this.currentOffset !== 0;
      },
      currentPageItems: [],
      currentOffset: 0
    };

    // Wczytanie pierwszej strony.
    paginator._load();
    return paginator;
  };
});
