module Print
    ( printBlosum
    , printBlosumCSV
    ) where
import Data.Maybe
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import TextShow
import Types
printBlosum :: Blosum -> T.Text
printBlosum = T.append header . T.append "\n" . body . unBlosum
  where
    header = "source,destination,value"
    body   = T.unlines
           . concatMap Map.elems
           . Map.elems
           . Map.mapWithKey
             ( \(AA x) -> Map.mapWithKey
                          (\ (AA y) (BlosumVal v)
                          -> T.intercalate "," [ T.singleton x
                                               , T.singleton y
                                               , showt v
                                               ]
                          )
             )
printBlosumCSV :: [AA] -> Blosum -> T.Text
printBlosumCSV order = T.append header . T.append "\n" . body . unBlosum
  where
    header     = T.intercalate "," . ("" :) . map (T.singleton . unAA) $ order
    body m     = T.unlines
               . map ( \x -> T.append (flip T.snoc ',' . T.singleton . unAA $ x)
                           . fromMaybe ""
                           . flip Map.lookup (printMap m)
                           $ x
                     )
               $ order
    printMap :: Map.Map AA (Map.Map AA BlosumVal) -> Map.Map AA T.Text
    printMap   = Map.map ( \v -> T.intercalate ","
                               . map (flip lookZero v)
                               $ order
                         )
    lookZero k = fromMaybe "" . fmap (showt . unBlosumVal) . Map.lookup k