/// <summary>
        /// Build individual page nodes
        /// </summary>
        public List <Page> BuildPageNodes(int collectionSize, int selectedPageNumber, int itemsPerPage, int numberOfNodesInPaginatedList)
        {
            var lastPage = _pageInCollectionService.GetLastPageInCollection(collectionSize, itemsPerPage);

            // If we have less then numberOfNodesInPaginatedList * itemPage in our collectionSize,
            // then we know we have a partial list
            if (numberOfNodesInPaginatedList * itemsPerPage > collectionSize)
            {
                return(BuildPartialList(collectionSize, selectedPageNumber, itemsPerPage));
            }

            //  We are at the first collection of nodes in paginated list: 1, 2 & 3
            if (selectedPageNumber < numberOfNodesInPaginatedList - 2)
            {
                return(BuildStartList(selectedPageNumber));
            }

            // We are at the last collection of nodes in paginated list : last -2 , last - 1 & last
            if (selectedPageNumber > lastPage - (numberOfNodesInPaginatedList - 2))
            {
                return(BuildEndList(collectionSize, selectedPageNumber, itemsPerPage, numberOfNodesInPaginatedList));
            }

            // We are at an in between collection of node in paginated list
            return(BuildFullList(selectedPageNumber));
        }
        /// <summary>
        /// Builds meta data to be used with PioneerPaginationTagHelper
        /// </summary>
        /// <param name="collectionSize">Total size of collection we are paginating</param>
        /// <param name="selectedPageNumber">Selected page number of pagination</param>
        /// <param name="itemsPerPage">How many items per paginated list</param>
        public PaginatedMetaModel GetMetaData(int collectionSize, int selectedPageNumber, int itemsPerPage)
        {
            var lastPage = _pageInCollectionService.GetLastPageInCollection(collectionSize, itemsPerPage);

            // Cover > out of range exceptions
            if (lastPage < selectedPageNumber)
            {
                selectedPageNumber = lastPage;
            }

            // Cover < out of range exceptions
            if (selectedPageNumber < 1)
            {
                selectedPageNumber = 1;
            }

            if (collectionSize == 0)
            {
                return(GetCollectionSizeZeroModel());
            }

            _pages = _nodeService.BuildPageNodes(collectionSize, selectedPageNumber, itemsPerPage, NumberOfNodesInPaginatedList);
            return(new PaginatedMetaModel
            {
                PreviousPage = _previousPageService.BuildPreviousPage(_pages, collectionSize, selectedPageNumber, itemsPerPage),
                Pages = _pages,
                NextPage = _nextPageService.BuildNextPage(
                    _pages,
                    collectionSize,
                    selectedPageNumber,
                    itemsPerPage,
                    NumberOfNodesInPaginatedList
                    )
            });
        }
 /// <summary>
 /// Determine if we need a Next Page
 /// </summary>
 private bool DisplayNextPage(int collectionSize, int selectedPageNumber, int itemsPerPage)
 {
     return(selectedPageNumber < _pageInCollectionService.GetLastPageInCollection(collectionSize, itemsPerPage));
 }