module SwiftNav.SBP.Settings 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

msgSettingsSave :: Word16
msgSettingsSave = 0x00A1

data MsgSettingsSave = MsgSettingsSave
  deriving ( Show, Read, Eq )

instance Binary MsgSettingsSave where
  get =
    return MsgSettingsSave

  put MsgSettingsSave =
    return ()

msgSettingsWrite :: Word16
msgSettingsWrite = 0x00A0

data MsgSettingsWrite = MsgSettingsWrite
  { msgSettingsWriteSetting :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgSettingsWrite where
  get = do
    msgSettingsWriteSetting <- liftM toStrict getRemainingLazyByteString
    return MsgSettingsWrite {..}

  put MsgSettingsWrite {..} = do
    putByteString msgSettingsWriteSetting

msgSettingsReadReq :: Word16
msgSettingsReadReq = 0x00A4

data MsgSettingsReadReq = MsgSettingsReadReq
  { msgSettingsReadReqSetting :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgSettingsReadReq where
  get = do
    msgSettingsReadReqSetting <- liftM toStrict getRemainingLazyByteString
    return MsgSettingsReadReq {..}

  put MsgSettingsReadReq {..} = do
    putByteString msgSettingsReadReqSetting

msgSettingsReadResp :: Word16
msgSettingsReadResp = 0x00A5

data MsgSettingsReadResp = MsgSettingsReadResp
  { msgSettingsReadRespSetting :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgSettingsReadResp where
  get = do
    msgSettingsReadRespSetting <- liftM toStrict getRemainingLazyByteString
    return MsgSettingsReadResp {..}

  put MsgSettingsReadResp {..} = do
    putByteString msgSettingsReadRespSetting

msgSettingsReadByIndexReq :: Word16
msgSettingsReadByIndexReq = 0x00A2

data MsgSettingsReadByIndexReq = MsgSettingsReadByIndexReq
  { msgSettingsReadByIndexReqIndex :: Word16
  } deriving ( Show, Read, Eq )

instance Binary MsgSettingsReadByIndexReq where
  get = do
    msgSettingsReadByIndexReqIndex <- getWord16le
    return MsgSettingsReadByIndexReq {..}

  put MsgSettingsReadByIndexReq {..} = do
    putWord16le msgSettingsReadByIndexReqIndex

msgSettingsReadByIndexResp :: Word16
msgSettingsReadByIndexResp = 0x00A7

data MsgSettingsReadByIndexResp = MsgSettingsReadByIndexResp
  { msgSettingsReadByIndexRespIndex   :: Word16
  , msgSettingsReadByIndexRespSetting :: ByteString
  } deriving ( Show, Read, Eq )

instance Binary MsgSettingsReadByIndexResp where
  get = do
    msgSettingsReadByIndexRespIndex <- getWord16le
    msgSettingsReadByIndexRespSetting <- liftM toStrict getRemainingLazyByteString
    return MsgSettingsReadByIndexResp {..}

  put MsgSettingsReadByIndexResp {..} = do
    putWord16le msgSettingsReadByIndexRespIndex
    putByteString msgSettingsReadByIndexRespSetting

msgSettingsReadByIndexDone :: Word16
msgSettingsReadByIndexDone = 0x00A6

data MsgSettingsReadByIndexDone = MsgSettingsReadByIndexDone
  deriving ( Show, Read, Eq )

instance Binary MsgSettingsReadByIndexDone where
  get =
    return MsgSettingsReadByIndexDone

  put MsgSettingsReadByIndexDone =
    return ()