module FPPrac.Trees 
    ( RoseTree(..)
    , RBTree(..)
    , NodeColor(..)
    , rbExampleTree
    , roseExampleTree
    , showRBTree
    , showRBTreeList
    , showRoseTree
    , showRoseTreeList
    , showTree
    , showTreeList
    ) where
    
    
import Prelude

import Eventloop.EventloopCore
import Eventloop.Types.EventTypes
import Eventloop.DefaultConfiguration
import qualified Eventloop.Module.Websocket.Canvas as C
import Eventloop.Module.DrawTrees
import Eventloop.Module.BasicShapes
import Eventloop.Utility.Trees.GeneralTree

data ProgramState = ProgramState
                  deriving (Eq, Show)

beginProgramState = ProgramState

eventloopConfig trees = defaultConfig { moduleConfigurations=[ defaultDrawTreesModuleConfiguration
                                                             , defaultBasicShapesModuleConfiguration
                                                             , C.defaultCanvasModuleConfiguration
                                                             ]}
                where
                    defaultConfig = allModulesEventloopConfiguration beginProgramState (eventloop trees)



eventloop :: [GeneralTree] -> ProgramState -> In -> (ProgramState, [Out])
eventloop trees state Start = (state, [ OutCanvas $ C.SetupCanvas 1 1 (round width, round height) (C.CSSPosition C.CSSFromCenter (C.CSSPercentage 50, C.CSSPercentage 50))
                                      , OutDrawTrees $ DrawTrees 1 trees
                                      , Stop
                                      ]
                              )
                            where
                                (_, width, height) = showGeneralTreeList trees
                              
                             

showRBTree :: RBTree -> IO()
showRBTree tree = showTree tree
 
showRBTreeList :: [RBTree] -> IO ()
showRBTreeList trees = showTreeList trees


showRoseTree :: RoseTree -> IO()
showRoseTree tree = showTree tree
 
showRoseTreeList :: [RoseTree] -> IO ()
showRoseTreeList trees = showTreeList trees


showTree :: (GeneralizeTree a) => a -> IO ()
showTree tree = showTreeList [tree]

showTreeList :: (GeneralizeTree a) => [a] -> IO ()
showTreeList trees = startMainloop (eventloopConfig $ map generalizeTree trees)