module SwiftNav.SBP.FileIo where

import Control.Monad
import Control.Monad.Loops
import Data.Binary
import Data.Binary.Get
import Data.Binary.IEEE754
import Data.Binary.Put
import Data.ByteString
import Data.ByteString.Lazy hiding ( ByteString )
import Data.Int
import Data.Word

msgFileioReadReq :: Word16
msgFileioReadReq = 0x00A8

data MsgFileioReadReq = MsgFileioReadReq
  { msgFileioReadReqSequence   :: Word32
  , msgFileioReadReqOffset     :: Word32
  , msgFileioReadReqChunkSize  :: Word8
  , msgFileioReadReqFilename   :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioReadReq where
  get = do
    msgFileioReadReqSequence <- getWord32le
    msgFileioReadReqOffset <- getWord32le
    msgFileioReadReqChunkSize <- getWord8
    msgFileioReadReqFilename <- liftM toStrict getRemainingLazyByteString
    return MsgFileioReadReq {..}

  put MsgFileioReadReq {..} = do
    putWord32le msgFileioReadReqSequence
    putWord32le msgFileioReadReqOffset
    putWord8 msgFileioReadReqChunkSize
    putByteString msgFileioReadReqFilename

msgFileioReadResp :: Word16
msgFileioReadResp = 0x00A3

data MsgFileioReadResp = MsgFileioReadResp
  { msgFileioReadRespSequence :: Word32
  , msgFileioReadRespContents :: [Word8]
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioReadResp where
  get = do
    msgFileioReadRespSequence <- getWord32le
    msgFileioReadRespContents <- whileM (liftM not isEmpty) getWord8
    return MsgFileioReadResp {..}

  put MsgFileioReadResp {..} = do
    putWord32le msgFileioReadRespSequence
    mapM_ putWord8 msgFileioReadRespContents

msgFileioReadDirReq :: Word16
msgFileioReadDirReq = 0x00A9

data MsgFileioReadDirReq = MsgFileioReadDirReq
  { msgFileioReadDirReqSequence :: Word32
  , msgFileioReadDirReqOffset   :: Word32
  , msgFileioReadDirReqDirname  :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioReadDirReq where
  get = do
    msgFileioReadDirReqSequence <- getWord32le
    msgFileioReadDirReqOffset <- getWord32le
    msgFileioReadDirReqDirname <- liftM toStrict getRemainingLazyByteString
    return MsgFileioReadDirReq {..}

  put MsgFileioReadDirReq {..} = do
    putWord32le msgFileioReadDirReqSequence
    putWord32le msgFileioReadDirReqOffset
    putByteString msgFileioReadDirReqDirname

msgFileioReadDirResp :: Word16
msgFileioReadDirResp = 0x00AA

data MsgFileioReadDirResp = MsgFileioReadDirResp
  { msgFileioReadDirRespSequence :: Word32
  , msgFileioReadDirRespContents :: [Word8]
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioReadDirResp where
  get = do
    msgFileioReadDirRespSequence <- getWord32le
    msgFileioReadDirRespContents <- whileM (liftM not isEmpty) getWord8
    return MsgFileioReadDirResp {..}

  put MsgFileioReadDirResp {..} = do
    putWord32le msgFileioReadDirRespSequence
    mapM_ putWord8 msgFileioReadDirRespContents

msgFileioRemove :: Word16
msgFileioRemove = 0x00AC

data MsgFileioRemove = MsgFileioRemove
  { msgFileioRemoveFilename :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioRemove where
  get = do
    msgFileioRemoveFilename <- liftM toStrict getRemainingLazyByteString
    return MsgFileioRemove {..}

  put MsgFileioRemove {..} = do
    putByteString msgFileioRemoveFilename

msgFileioWriteReq :: Word16
msgFileioWriteReq = 0x00AD

data MsgFileioWriteReq = MsgFileioWriteReq
  { msgFileioWriteReqSequence :: Word32
  , msgFileioWriteReqOffset   :: Word32
  , msgFileioWriteReqFilename :: ByteString
  , msgFileioWriteReqData     :: [Word8]
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioWriteReq where
  get = do
    msgFileioWriteReqSequence <- getWord32le
    msgFileioWriteReqOffset <- getWord32le
    msgFileioWriteReqFilename <- liftM toStrict getRemainingLazyByteString
    msgFileioWriteReqData <- whileM (liftM not isEmpty) getWord8
    return MsgFileioWriteReq {..}

  put MsgFileioWriteReq {..} = do
    putWord32le msgFileioWriteReqSequence
    putWord32le msgFileioWriteReqOffset
    putByteString msgFileioWriteReqFilename
    mapM_ putWord8 msgFileioWriteReqData

msgFileioWriteResp :: Word16
msgFileioWriteResp = 0x00AB

data MsgFileioWriteResp = MsgFileioWriteResp
  { msgFileioWriteRespSequence :: Word32
  } deriving ( Show, Read, Eq )

instance Binary MsgFileioWriteResp where
  get = do
    msgFileioWriteRespSequence <- getWord32le
    return MsgFileioWriteResp {..}

  put MsgFileioWriteResp {..} = do
    putWord32le msgFileioWriteRespSequence