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

    -- ToRoseTree Generics
    , ToRoseTree (..)
    , genericToRoseTree
    ) where
    
    
import Prelude

import Eventloop.Core
import Eventloop.Types.Events
import Eventloop.Types.System
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

eventloopConfiguration trees
    = EventloopSetupConfiguration
        { beginProgstate = beginProgramState
        , eventloopF = eventloop trees
        , setupModuleConfigurations = [ setupDrawTreesModuleConfiguration
                                      , setupBasicShapesModuleConfiguration
                                      , C.setupCanvasModuleConfiguration
                                      ]
        }



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 = startEventloopSystem (eventloopConfiguration $ map generalizeTree trees)