module FPPrac.Trees.RedBlackTree
        ( showRBTree
        , showRBTreeList
        , RBTreeG(..)
        , ColorG(..)
        , exampleTree
        )where

import FPPrac.Trees.GeneralTree
import FPPrac.Trees.LayoutTree
import EventLoop.Output

data ColorG = RedG
            | BlackG
            | GreyG

data RBTreeG = RBNodeG ColorG String [RBTreeG]
  
instance GeneralizeTree RBTreeG where
    generalizeTree (RBNodeG col _ [])       = GeneralTreeBox content []
                                            where
                                                content = [GeneralNode (colorGToColor col) 5]
                                                
    generalizeTree (RBNodeG col str children) = GeneralTreeBox content children'WithLines
                                            where
                                                content = [GeneralNode (colorGToColor col) 20, GeneralNodeText (0,0,0) str]
                                                children' = map generalizeTree children
                                                line = GeneralLine (0,0,0)
                                                children'WithLines = zip (repeat line) children'

colorGToColor :: ColorG -> Color
colorGToColor RedG   = (255, 0, 0)
colorGToColor BlackG = (0, 0, 0)
colorGToColor GreyG  = (125, 125, 125)
                                                
showRBTree :: RBTreeG -> IO ()
showRBTree rbTree = showRBTreeList [rbTree]

showRBTreeList :: [RBTreeG] -> IO ()                                                
showRBTreeList rbTrees = outSingle (OutGraphical (Draw (showRBTreeList' 0 0 rbTrees) "trees"))

showRBTreeList' :: TopOffset -> Int -> [RBTreeG] -> GObject
showRBTreeList' _ _ [] = Container []
showRBTreeList' top i (rbTree:ts) = Container (text:pGeneral:gts)
                                where
                                (Container gts) = showRBTreeList' top' i' ts
                                top' = 10 + bottomGeneral --(max bottomGeneral bottomRB)
                                (lGeneral, rightGeneral, bottomGeneral) = layoutGeneralTree 0 top (generalizeTree rbTree)
                                --(lRB, _, bottomRB)                = layoutRBTree (rightGeneral + 30) top rbTree
                                pGeneral = printTree lGeneral
                                --pRB      = printTree lRB
                                i' = i + 1
                                text = treeIndex i (0, top)

layoutRBTree :: LeftOffset -> TopOffset -> RBTreeG -> (LayoutTree, RightOffset, BottomOffset)
layoutRBTree left top rbTree = layoutGeneralTree left top $ generalizeTree rbTree               
               
               
exampleTree = RBNodeG BlackG "12"
                        [ RBNodeG RedG "11"
                                    [ RBNodeG BlackG "16"
                                                [ RBNodeG BlackG "" [],
                                                  RBNodeG BlackG "" []
                                                ],
                                      RBNodeG BlackG "24"
                                                [RBNodeG BlackG "" [],
                                                 RBNodeG BlackG "" []
                                                ]
                                    ],
                          RBNodeG RedG "13"
                                    [RBNodeG BlackG "36" [],
                                     RBNodeG BlackG "28"
                                               [RBNodeG RedG "36"
                                                          [RBNodeG BlackG "" [],
                                                           RBNodeG BlackG "" []
                                                          ],
                                                RBNodeG BlackG "" []
                                               ]
                                    ]
                        ]