-- ----------------------------------------------------------------------------
{- |
  Module     : Holumbus.MapReduce.UserInterface
  Copyright  : Copyright (C) 2008 Stefan Schmidt
  License    : MIT

  Maintainer : Stefan Schmidt (stefanschmidt@web.de)
  Stability  : experimental
  Portability: portable
  Version    : 0.1


-}
-- ----------------------------------------------------------------------------

module Holumbus.MapReduce.UserInterface
    (
      -- * operations
      runUI
    )
where

import           Data.Maybe

import           Holumbus.Common.Utils                         ( handleAll )
import           Holumbus.Common.FileHandling
import qualified Holumbus.Common.Debug                          as DEBUG
import qualified Holumbus.Console.Console                       as Console

import qualified Holumbus.MapReduce.MapReduce                   as MR
import qualified Holumbus.MapReduce.Types                       as T



-- ----------------------------------------------------------------------------
-- Operations
-- ----------------------------------------------------------------------------

-- | runs the user interface... just add an fileSystem an a fancy version-number
runUI :: (MR.MapReduce mr) => mr -> String -> IO ()
runUI mr version
  = do
    -- starts the console with the specified commands
    Console.handleUserInput (createConsole version) mr



-- ----------------------------------------------------------------------------
-- private functions
-- ----------------------------------------------------------------------------


createConsole :: (MR.MapReduce mr) => String -> Console.ConsoleData mr
createConsole version =
  Console.addConsoleCommand "site"      getMySiteId "" $
  Console.addConsoleCommand "mrtype"    getMapReduceType "" $
  Console.addConsoleCommand "startC"    startControlling "" $
  Console.addConsoleCommand "stopC"     stopControlling "" $
  Console.addConsoleCommand "isC"       isControlling "" $
  Console.addConsoleCommand "step"      doSingleStep "" $
  Console.addConsoleCommand "mrJob"     doMapReduceJob "" $
  Console.addConsoleCommand "parse"     parseJob "" $
  Console.addConsoleCommand "debug"     printDebug "" $ 
  Console.addConsoleCommand "version"   (printVersion version) "prints the version" $ 
  Console.initializeConsole

 
getMySiteId :: (MR.MapReduce mr) => mr -> [String] -> IO ()
getMySiteId mr _
  = handleAll (\e -> putStrLn $ show e) $
      do
      s <- MR.getMySiteId mr
      putStrLn $ show s


getMapReduceType :: (MR.MapReduce mr) => mr -> [String] -> IO ()
getMapReduceType mr _
  = handleAll (\e -> putStrLn $ show e) $
      do
      t <- MR.getMapReduceType mr
      putStrLn $ show t

  
startControlling :: (MR.MapReduce mr) => mr -> [String] -> IO ()
startControlling mr _
  = handleAll (\e -> putStrLn $ show e) $
      do
      MR.startControlling mr


stopControlling :: (MR.MapReduce mr) => mr -> [String] -> IO ()
stopControlling mr _
  = handleAll (\e -> putStrLn $ show e) $
      do
      MR.stopControlling mr


isControlling :: (MR.MapReduce mr) => mr -> [String] -> IO ()
isControlling mr _
  = handleAll (\e -> putStrLn $ show e) $
      do
      b <- MR.isControlling mr
      putStrLn $ show b


  
doSingleStep :: (MR.MapReduce mr) => mr -> [String] -> IO ()
doSingleStep mr _
  = handleAll (\e -> putStrLn $ show e) $
      do
      MR.doSingleStep mr


  
doMapReduceJob :: (MR.MapReduce mr) => mr -> [String] -> IO ()
doMapReduceJob mr opts
  = do
    handleAll (\e -> putStrLn $ show e) $
      do
      (mbName,_) <- Console.nextOption opts
      jobInfo <- (loadFromXmlFile (fromJust mbName))::IO T.JobInfo
      r <- MR.doMapReduceJob jobInfo mr
      putStrLn "RESULT:" 
      putStrLn $ show r
      return ()


parseJob :: (MR.MapReduce mr) => mr -> [String] -> IO ()
parseJob _ opts
  = do
    handleAll (\e -> putStrLn $ show e) $
      do
      (mbName,_) <- Console.nextOption opts
      jobInfo <- (loadFromXmlFile (fromJust mbName))::IO T.JobInfo
      putStrLn $ show jobInfo
      return ()


printDebug :: (MR.MapReduce mr) => mr -> [String] -> IO ()
printDebug mr _
  = do
    handleAll (\e -> putStrLn $ show e) $
      do
      DEBUG.printDebug mr

  
printVersion :: (MR.MapReduce mr) => String -> mr -> [String] -> IO ()
printVersion version _ _
  = do
    putStrLn version