module Stagen.File where

import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.IO as TL
import Control.Monad (when)
import System.FilePath.Find
import Text.Markdown
import Text.Blaze.Html.Renderer.Text (renderHtml)

import Stagen.Opts
import Stagen.Page

fromMarkdown :: Verbose -> FilePath -> IO (FilePath, Page)
fromMarkdown verbose mdPath = do
    let htmlPath = changeExtension mdPath "html"
    page <- readPage mdPath
    when (verbose == Verbose) (putStrLn htmlPath)
    return (htmlPath, page)

eligable :: [FilePath] -> FindClause Bool
eligable ignore = do
    isMarkdown <- (== ".md") <$> extension
    name <- fileName
    let isFileName = and (map (/= name) ignore)
    return (isMarkdown && isFileName)

readPage :: FilePath -> IO Page
readPage path = do
    content <- TL.readFile path
    let pageTitle = TL.filter (not . isMarkdownChar) (TL.takeWhile isNotNewLine content)
    let pageContent = render content
    return Page{..}
 where
    isMarkdownChar ch = ch == '_' || ch == '*' || ch == '#' || ch == '>'
    isNotNewLine ch = ch /= '\n' && ch /= '\r'

changeExtension :: FilePath -> String -> FilePath
changeExtension path newExtension
    | hasExt = basename ++ newExtension
    | otherwise = path ++ ('.' : newExtension)
 where
    revPath = reverse path
    hasExt = elem '.' (takeWhile (/= '/') revPath)
    basename = reverse (dropWhile (/= '.') revPath)

render :: TL.Text -> TL.Text
render = renderHtml . markdown def