module Export.CSV (csvRemarks) where

import Ast
import Invalid
import Export.Generic

import Text.PrettyPrint
import Data.List (intersperse)

csvRemarks :: String -> [String] -> [Judgement] -> Either Invalid Doc
csvRemarks delimiter propertyList judgements = do
  doc <- mapM (formatJudgement delimiter propertyList) judgements
  pure ((hcat $ (intersperse (text delimiter)) $ map text propertyList) $$ (vcat $ doc))


formatJudgement :: String -> [String] -> Judgement -> Either Invalid Doc
formatJudgement delimiter properties judgement = do
  doc <- mapM (mapfun judgement) properties
  pure $ hcat $ (intersperse (text delimiter)) doc
  where
    mapfun = flip lookupProperty

lookupProperty :: String -> Judgement -> Either Invalid Doc
lookupProperty name (Judgement (_, properties, _, _)) =
  case (lookup name (map (\(Property (n,v)) -> (n,v)) properties)) of
    Nothing -> Left $ PropertyNotFound name
    Just(value) -> pure $ formatPropertyExp value
lookupProperty name _ =
  Left $ PropertyNotFound name

formatPropertyExp :: PropertyExp -> Doc
formatPropertyExp (Lookup (index, name)) =
  brackets $ int index <> text "." <> text name
formatPropertyExp (Value value) = text value
formatPropertyExp (Num value) = pointsDoc value