class Pagination {
    constructor(items = [], perPage = 10) {
      this.items = items;
      this.page = 1;
      this.perPage = perPage;
      this.totalItems = items.length;
      
      this.emitter = new EventEmitter();
    }
  
    on(event, callback) {
      this.emitter.on(event, callback);
    }
  
    emit(event, data) {
      this.emitter.emit(event, data); 
    }
  
    setItems(items) {
      if (!Array.isArray(items)) {
        throw new Error("Items must be an array.");
      }
      this.items = items;
      this.totalItems = items.length;
      // Não resetar a página aqui
      this.emit('itemsUpdated');
      this.emit('change');
    }
  
    setPage(pageNumber) {
      if (pageNumber < 1 || pageNumber > this.getTotalPages()) {
        throw new Error("Invalid page number.");
      }
      this.page = pageNumber;
      this.emit('pageChanged');
      this.emit('change');
    }
  
    setPerPage(perPage) {
      if (this.perPage !== perPage) {
        this.perPage = perPage;
        this.page = 1; // Resetar para a primeira página
        this.emit('perPageChanged');
        this.emit('change');
      }
    }
  
    getPageItems() {
      const startIndex = (this.page - 1) * this.perPage;
      return this.items.slice(startIndex, startIndex + this.perPage);
    }
  
    nextPage() {
      if (this.page < this.getTotalPages()) {
        this.page++;
        this.emit('pageChanged');
        this.emit('change');
      }
    }
  
    prevPage() {
      if (this.page > 1) {
        this.page--;
        this.emit('pageChanged');
        this.emit('change');
      }
    }
  
    getTotalPages() {
      return Math.ceil(this.totalItems / this.perPage);
    }
  
    getPaginationInfo() {
      return {
        currentPage: this.page,
        totalPages: this.getTotalPages(),
        perPage: this.perPage,
        totalItems: this.totalItems
      };
    }

}
  