-- | Discovers the site's writings: its groups and standalone pages
module MathiasSM.Writings (discoverGroups, discoverStandalonePages) where

import Data.List (nub, sort)
import Data.Maybe (mapMaybe)
import Hakyll (MonadMetadata (getAllMetadata), toFilePath)
import MathiasSM.Config (SiteConfig (contentDir, siteEnv), pagesPattern, writingsPattern)
import MathiasSM.Content (groupOf, isHidden, isIndex)
import System.FilePath.Posix (takeBaseName)

-- | The distinct groups across @writings/@, from `group:` front matter or the folder a post sits in
discoverGroups :: (MonadMetadata m) => SiteConfig -> m [String]
discoverGroups :: forall (m :: * -> *). MonadMetadata m => SiteConfig -> m [String]
discoverGroups SiteConfig
cfg = do
    pages <- Pattern -> m [(Identifier, Metadata)]
forall (m :: * -> *).
MonadMetadata m =>
Pattern -> m [(Identifier, Metadata)]
getAllMetadata (SiteConfig -> Pattern
writingsPattern SiteConfig
cfg)
    pure $ sort $ nub $ mapMaybe (\(Identifier
ident, Metadata
metadata) -> String -> Identifier -> Metadata -> Maybe String
groupOf (SiteConfig -> String
contentDir SiteConfig
cfg) Identifier
ident Metadata
metadata) pages

-- | The standalone pages: flat @writings/@ files that are not group indexes
discoverStandalonePages :: (MonadMetadata m) => SiteConfig -> m [String]
discoverStandalonePages :: forall (m :: * -> *). MonadMetadata m => SiteConfig -> m [String]
discoverStandalonePages SiteConfig
cfg = do
    pages <- Pattern -> m [(Identifier, Metadata)]
forall (m :: * -> *).
MonadMetadata m =>
Pattern -> m [(Identifier, Metadata)]
getAllMetadata (SiteConfig -> String -> Pattern
pagesPattern SiteConfig
cfg String
"*")
    pure $ sort [takeBaseName (toFilePath ident) | (ident, metadata) <- pages, not (isIndex metadata), not (isHidden (siteEnv cfg) metadata)]