content: {-# 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
  