{-|
Module      : Parse
Description : Reads commandline input and prints Morphisms nicely.
Copyright   : Adam Saltz
License     : BSD3
Maintainer  : saltz.adam@gmail.com
Stability   : experimental

Longer description to come.
-}

module Parse
where
import Braids
import Complex
import Kh

import qualified Data.Map as M (toList)
import Data.Set (Set)
import qualified Data.Set as S (toList)
import Data.List (sortBy)
import Data.List.Split (splitOneOf)

-- | Parse command line input into a braid.
-- | e.g. @Parse "[1,2,-2,-3] 4" == Braid [1,2,-2,-3] 4f
parse :: [String] -> Braid
parse input = braid where
    braid = Braid {braidWord = parseWord word, braidWidth = width}
    parseWord = fmap (read :: String -> Int) . filter (not . null) . splitOneOf ",]["
    (word, width) = (input !! 0, read $ input !! 1   :: Int)

-- | Prints kappa in a nice way.
showKappa' :: Maybe (Int, Morphisms) -> [String]
showKappa' s = case s of 
                Nothing -> ["Psi doesn't vanish!"]
                Just (kappa, mors) -> ("Kappa is " ++ show kappa) : showMorphisms mors

-- | Prints Morphisms nicely.
showMorphisms :: Morphisms -> [String]
showMorphisms mors =    fmap fst
                      . sortBy (\(i, _) (i',_) -> compare i i') 
                      . fmap showMorphism 
                      . M.toList 
                      $ mors

-- | Prints a single morphism nicely.
showMorphism :: (AlgGen, Set AlgGen) -> (String, Int)
showMorphism (gs,gs') = (  "Filtration level: " ++ show (kgrade' gs) ++ ".\n"
                        ++ show (S.toList . toSet $ gs) ++ "\n"
                        ++ "|\n"
                        ++ "|\n"
                        ++ "|\n"
                        ++ "V\n"       
                        ++ show (S.toList gs') ++ "\n\n"
                        , kgrade' gs)