import Network
import System.Environment
import System.IO
import Control.Monad.State.Lazy(join,evalState)

import ServerMessages(msgParse,MarsMsg)
import Rover(initstate,SRC,acceptMessageAndMove)
import Util(split)

main =
    do argv <- getArgs
       let host : port : _ = argv
       putStrLn $ "connecting to " ++ host ++ ":" ++ port
       h <- connectTo host $ PortNumber (fromIntegral (read port))
       hSetBuffering h NoBuffering
       -- Read message stream from the server
       t <- hGetContents h
       -- parse messages
       let messages = map msgParse (split ';' t)
       -- feed messages into the state monad
       let cmds = evalState (msgProc messages) initstate
       -- Send responses to the server
       hPutStr h (show cmds)

-- produces rover commands in response to messages from Mars
msgProc :: [MarsMsg] -> SRC
msgProc ms = mapM acceptMessageAndMove ms >>= return . join


