// Angular Core
import { Component, Input, OnInit } from '@angular/core';

// Services
import { SearchService } from 'src/app/services/search/search.service';

@Component({
  standalone: false,
  selector: 'app-nova-pagination',
  templateUrl: './nova-pagination.component.html',
  styleUrls: ['./nova-pagination.component.scss']
})
export class NovaPaginationComponent implements OnInit {

  @Input() totalPages!: number;
  @Input() pageNumber!: number;
  @Input() pageSize!: number;

  pager: any = {};

  constructor(
    private searchService: SearchService
  ) { }

  ngOnInit(): void {
    this.pager = this.getPager(this.totalPages, this.pageNumber, this.pageSize);
  }

  setPage(num: number) {
    window.scrollTo(0, 0);
    this.searchService.setPage.emit(num);
  };

  // service implementation
  getPager(totalItems: number, currentPage: number, pageSize: number) {
    // default to first page
    currentPage = currentPage || 1;

    // default page size is 10
    pageSize = pageSize || 10;

    // calculate total pages
    var totalRows = Math.ceil(totalItems / pageSize);

    var startPage, endPage;
    if (totalRows <= 10) {
        // less than 10 total pages so show all
        startPage = 1;
        endPage = totalRows;
    } else {
        // more than 10 total pages so calculate start and end pages
        if (currentPage < 10) {
            startPage = 1;
            endPage = 10;
        } else if (currentPage + 9 >= totalRows) {
            startPage = totalRows - 9;
            endPage = totalRows;
        } else {
            startPage = currentPage ;
            endPage = currentPage + 9;
        }
    }

    // calculate start and end item indexes
    var startIndex = (currentPage - 1) * pageSize;
    var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);

    // create an array of pages to ng-repeat in the pager control
    var pages = [];
    for (var i = startPage; i< endPage + 1; i++) {
        pages.push(i);
    }
    // return object with all pager properties required by the view
    return {
        totalItems: totalItems,
        currentPage: currentPage,
        pageSize: pageSize,
        totalRows: totalRows,
        startPage: startPage,
        endPage: endPage,
        startIndex: startIndex,
        endIndex: endIndex,
        pages: pages
    };
  };

}
