module Lib
  ( dbInit,
    dbProc,
    dbTerm
  ) where

-- Standard libraries
import Control.Monad
import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe

-- Custom libraries
import Database.LambdaDB

dbInit :: IO DB
dbInit = do
  putStrLn "Initiate DB ..."
  return initDB

dbProc :: DB -> IO ()
dbProc d = void . runMaybeT $ do
  lift . putStrLn $ "DB is now running"
  void . g $ d
  return ()
  where g db = do
          com <- lift getLine
          newdb <- case com of
                  "" -> lift . return $ db
                  _ ->
                    case (readsPrec 0 com) of
                      (ComQuit, _):_ -> mzero
                      (ComStatus, _):_ -> lift . dbStatus $ db
                      (ComInsert k v, _):_ -> lift . dbInsert k v $ db
                      (ComDelete k, _):_ -> do
                        lift. print $ k
                        lift. dbInsert k (DBNone None) $ db
                      (ComFind k, _):_ -> lift . dbFind k $ db
                      _ -> do
                        lift . putStrLn $ "Command Error"
                        return db
          g newdb

dbStatus :: DB -> IO DB
dbStatus db = do
  putStrLn "On running"
  return db

dbInsert :: Key -> DBData -> DB -> IO DB
dbInsert k v db = do
  let newdb = insertData k v db
  putStrLn "OK"
  return newdb

dbFind :: Key -> DB -> IO DB
dbFind k db = do
  putStrLn . show . findData k $ db
  return db

dbTerm :: IO ()
dbTerm = putStrLn "Terminate DB"