import Prelude hiding ( writeFile )
import Control.Monad
import Control.Monad.State.Strict
import Control.Monad.Trans
import System.FilePath
import Storage.Hashed.Tree
import Storage.Hashed.AnchoredPath( floatPath )
import Storage.Hashed.Monad
import Storage.Hashed.Darcs
import Storage.Hashed.Plain
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as BS
import qualified Data.Set as S

primes l = go [] l where
    go have (x:xs) | any ((==0) . (mod x)) have = go have xs
                   | otherwise = go (x:have) xs
    go have [] = have

buildup = do forM (primes [2..5000]) $ \i -> do
               liftIO $ putStrLn $ "DIRECTORY: " ++ show i
               createDirectory (floatPath $ show i)
               forM (primes [2..70]) $ \j ->
                   do writeFile (floatPath $ show j </> show j)
                                (BL.fromChunks [BS.replicate (i * j + 1000000) 0])
                      liftIO $ putStrLn $ "FILE: " ++ show i ++ "/" ++ show j

main = do writeDarcsHashed emptyTree "./_monadtest"
          hashedTreeIO buildup emptyTree "./_monadtest"
          -- plainTreeIO buildup emptyTree "./_monadtest"
          -- runTreeMonad buildup $ initialState emptyTree bazinga
    where bazinga ch = do
            forM (S.toList ch) $ \c -> do
                         current <- gets tree
                         case find current c of
                           Just (File b) -> do
                                         liftIO $ readBlob b >>= print . BL.length
                           _ -> return ()
            modify $ \st -> st { tree = emptyTree }

