module Graphics.LambdaCube.Loader.ResourceScript (loadResourcesCfg,PathType(..),ResourcePath,ResourceGroup) where

import UU.Parsing
import UU.Scanner


import Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner
import Graphics.LambdaCube.Loader.ParserUtil

-- | The type of path leading to a resource.
data PathType = PathDir  -- ^ An ordinary directory.
              | PathZip  -- ^ A zip compressed directory.

type ResourcePath = (PathType, String)

type ResourceGroup = (String, [ResourcePath])

loadResourcesCfg :: FilePath -> IO (Maybe [(String, [(PathType, String)])])
loadResourcesCfg file = do
    txt <- readFile file
    parseResourcesCfg file txt

parseResourcesCfg :: String -> String -> IO (Maybe [(String, [(PathType, String)])])
parseResourcesCfg file txt = case parseTokens pResourceScript (tokenize file txt) of
    Left errs -> do
        mapM_ (\m -> putStrLn $ "ResourceScript " ++ m) errs
        return Nothing
    Right tree -> return (Just tree)

type TokenParser a = Parser Token a

parseTokens :: TokenParser a -> [Token] -> Either [String] a
parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)
  where
    steps = parse p tks
    msgs  = getMsgs steps
    Pair v final = evalSteps steps

pResourceScript :: AnaParser [Token] Pair Token (Maybe Token) [(String,[(PathType, String)])]
pResourceScript = pList pResourceGroup

pResourceGroup :: AnaParser [Token] Pair Token (Maybe Token) (String, [(PathType, String)])
pResourceGroup = (,) <$= "[" <*> pVarid <*= "]" <*> pList pResourceGroupContent

pResourceGroupContent :: AnaParser [Token] Pair Token (Maybe Token) (PathType, String)
pResourceGroupContent = pFileSystem <|> pZip

pFileSystem :: AnaParser [Token] Pair Token (Maybe Token) (PathType, String)
pFileSystem = (,) PathDir <$= "FileSystem" <*= "=" <*> pVarid

pZip :: AnaParser [Token] Pair Token (Maybe Token) (PathType, String)
pZip = (,) PathZip <$= "Zip" <*= "=" <*> pVarid