module Penny.Copper.Memos.Posting (
  memo, render, isCommentChar) where

import Control.Applicative ((<*>), (<*), (<$), (<$>))
import qualified Data.Text as X
import Text.Parsec (char, satisfy, many, (<?>))
import Text.Parsec.Text ( Parser )

import Penny.Copper.Util (eol, rangeLettersToSymbols)
import qualified Penny.Lincoln.Bits as B
import qualified Penny.Lincoln.TextNonEmpty as TNE

isCommentChar :: Char -> Bool
isCommentChar c = rangeLettersToSymbols c
                  || c == ' '

memo :: Parser B.Memo
memo = B.Memo <$> many memoLine

memoLine :: Parser B.MemoLine
memoLine = (\c cs -> B.MemoLine $ TNE.TextNonEmpty c (X.pack cs))
           <$ char '\''
           <*> satisfy isCommentChar
           <*> many (satisfy isCommentChar)
           <* eol
           <?> "posting memo"

render :: B.Memo -> Maybe X.Text
render (B.Memo ls) = X.concat <$> mapM renderLine ls 

renderLine :: B.MemoLine -> Maybe X.Text
renderLine (B.MemoLine l) =
  if TNE.all isCommentChar l
  then Just $
       X.pack (replicate 8 ' ')
       `X.snoc` '\''
       `X.append` TNE.toText l
       `X.snoc` '\n'
  else Nothing