{--
  Dumps SceneGraph into Haskell. 
--}
module Graphics.SceneGraph.Dump where

import System.IO
import System.Process
import Graphics.SceneGraph.Basic
import Data.Graph.Inductive
import Data.Graph.Inductive.Graphviz
import  Graphics.SceneGraph.Library

dump :: SceneGraph -> IO ()
dump gr = withFile  "c:/Mark/MyDevelopments/haskell/SceneGraph/src/Graphics/SceneGraph/TestLoad.hs" WriteMode $ \fd -> do
             preamble fd
             mapM_ (dumpNode fd gr) (nodes gr)

dumpNode fd gr nde = do
                     let (SceneNode (n,l) dte) = llab gr nde
                     hPutStrLn fd $ "n" ++ (show n) ++ " = SceneNode " ++ (show (n,l)) ++ "(" ++ (writeSceneData dte) ++ ")"


writeSceneData Group = "Group"
writeSceneData (Geode geom ) = "Geode $ " ++ (show  geom)
writeSceneData LOD = "LOD"
writeSceneData (MatrixTransform m) = "MatrixTransform $ " ++ show m
-- writeSceneData (SimpleTransform a b c) = "SimpleTransform " ++ show a ++ " " ++ show b ++ " " ++ show c
writeSceneData (Switch i) = "Switch " ++ show  i
writeSceneData (Material mt) = "Material $ " ++ (show mt)
writeSceneData (Handler _ _) = "Handler Nothing Nothing"  -- User will need to rebuild this part.
writeSceneData Light = "Light"
writeSceneData Camera = "Camera"
writeSceneData (Texture _) = "Texture"
writeSceneData (Text t ) = "Text " ++ "\"" ++ t ++ "\""
             

preamble fd = do
            hPutStrLn fd "module Graphics.SceneGraph.TestLoad where"
            hPutStrLn fd "import Graphics.SceneGraph.Basic"
            hPutStrLn fd "import Graphics.SceneGraph.Matrix"
            hPutStrLn fd "import Graphics.SceneGraph.Vector"
            hPutStrLn fd "import Graphics.UI.GLUT.Objects as GL"
            hPutStrLn fd "import Data.Graph.Inductive hiding (mkNode,context)"
            hPutStrLn fd "import Data.Sequence hiding (empty)"
            hPutStrLn fd "import Data.Reactive"
            hPutStrLn fd "import Data.Array"
            hPutStrLn fd "import Graphics.Rendering.OpenGL.GL.BeginEnd"
            hPutStrLn fd "import Graphics.Rendering.OpenGL (Vector3)"
            hPutStrLn fd "import Graphics.UI.GLUT  hiding (Sink,Red, Green,Blue,Matrix,Error,get,scale,translate,rotate,Light,light,texture,Texture,Text,set,get)"
            hPutStrLn fd "import Graphics.UI.GLUT.Fonts"