{-# LANGUAGE RecordWildCards #-}
-- | Data pagination.

module Data.Pagination where

import Data.Default
import Data.Maybe
import Safe
import Network.URI
import Network.URI.Params

-- | A pagination object, holds information about the name, total, per
--   page, current page, etc.
data Pagination = Pagination
  { pnTotal       :: Integer
  , pnPerPage     :: Integer
  , pnName        :: String
  , pnCurrentPage :: Integer
  , pnShowDesc    :: Bool
  } deriving (Show)

instance Default Pagination where
  def = Pagination
        { pnTotal       = 0
        , pnPerPage     = 5
        , pnName        = ""
        , pnCurrentPage = 1
        , pnShowDesc    = True
        }

-- | Get the page count of the pagination results.
pnPageCount :: Pagination -> Integer
pnPageCount Pagination{..} = max 1 $
  if total/perpage > fromIntegral (round (total/perpage))
     then round (total/perpage) + 1
     else round (total/perpage)
  where total = fromIntegral pnTotal
        perpage = fromIntegral pnPerPage

-- | Add the current page of the pagination from the current URI.
addCurrentPNData :: URI -> Pagination -> Pagination
addCurrentPNData uri pagination =
  pagination { pnCurrentPage = currentPage
             , pnPerPage = perPage
             }

    where currentPage = fromMaybe 1 $ do
            p <- lookup (param "page") $ uriParams uri
            readMay p
          perPage = fromMaybe (pnPerPage pagination) $ do
            p <- lookup (param "per_page") $ uriParams uri
            readMay p
          param n = pnName pagination ++ "_" ++ n