module Network.Mosquitto.LowLevel.Types
(

    Mosquitto(..)
  , MosquittoMessage(..)
  , MosquittoResult(..)
  , MosquittoLogType(..)

) where

import           Foreign.C
import           Foreign.C.String
import           Foreign.Ptr

data Mosquitto

data MosquittoMessage = MosquittoMessage {
    mid        :: CInt
  , topic      :: CString
  , payload    :: Ptr ()
  , payloadLen :: CInt
  , qos        :: CInt
  , retain     :: Bool
}

data MosquittoLogType =
    MOSQ_LOG_NONE
  | MOSQ_LOG_INFO
  | MOSQ_LOG_NOTICE
  | MOSQ_LOG_WARNING
  | MOSQ_LOG_ERR
  | MOSQ_LOG_DEBUG
  | MOSQ_LOG_SUBSCRIBE
  | MOSQ_LOG_UNSUBSCRIBE
  | MOSQ_LOG_WEBSOCKETS
  | MOSQ_LOG_ALL
  deriving (Eq, Show, Read)

instance Enum MosquittoLogType where
  fromEnum MOSQ_LOG_NONE        = 0x00
  fromEnum MOSQ_LOG_INFO        = 0x01
  fromEnum MOSQ_LOG_NOTICE      = 0x02
  fromEnum MOSQ_LOG_WARNING     = 0x04
  fromEnum MOSQ_LOG_ERR         = 0x08
  fromEnum MOSQ_LOG_DEBUG       = 0x10
  fromEnum MOSQ_LOG_SUBSCRIBE   = 0x20
  fromEnum MOSQ_LOG_UNSUBSCRIBE = 0x40
  fromEnum MOSQ_LOG_WEBSOCKETS  = 0x80
  fromEnum MOSQ_LOG_ALL         = 0xFFFF
  toEnum  0x00   = MOSQ_LOG_NONE
  toEnum  0x01   = MOSQ_LOG_INFO
  toEnum  0x02   = MOSQ_LOG_NOTICE
  toEnum  0x04   = MOSQ_LOG_WARNING
  toEnum  0x08   = MOSQ_LOG_ERR
  toEnum  0x10   = MOSQ_LOG_DEBUG
  toEnum  0x20   = MOSQ_LOG_SUBSCRIBE
  toEnum  0x40   = MOSQ_LOG_UNSUBSCRIBE
  toEnum  0x80   = MOSQ_LOG_WEBSOCKETS
  toEnum  0xFFFF = MOSQ_LOG_ALL


data MosquittoResult =
    MOSQ_ERR_CONN_PENDING
  | MOSQ_ERR_SUCCESS
  | MOSQ_ERR_NOMEM
  | MOSQ_ERR_PROTOCOL
  | MOSQ_ERR_INVAL
  | MOSQ_ERR_NO_CONN
  | MOSQ_ERR_CONN_REFUSED
  | MOSQ_ERR_NOT_FOUND
  | MOSQ_ERR_CONN_LOST
  | MOSQ_ERR_TLS
  | MOSQ_ERR_PAYLOAD_SIZE
  | MOSQ_ERR_NOT_SUPPORTED
  | MOSQ_ERR_AUTH
  | MOSQ_ERR_ACL_DENIED
  | MOSQ_ERR_UNKNOWN
  | MOSQ_ERR_ERRNO
  | MOSQ_ERR_EAI
  | MOSQ_ERR_PROXY
  deriving (Show, Eq, Read)

instance Enum MosquittoResult where
  toEnum (-1) = MOSQ_ERR_CONN_PENDING
  toEnum 0    = MOSQ_ERR_SUCCESS
  toEnum 1    = MOSQ_ERR_NOMEM
  toEnum 2    = MOSQ_ERR_PROTOCOL
  toEnum 3    = MOSQ_ERR_INVAL
  toEnum 4    = MOSQ_ERR_NO_CONN
  toEnum 5    = MOSQ_ERR_CONN_REFUSED
  toEnum 6    = MOSQ_ERR_NOT_FOUND
  toEnum 7    = MOSQ_ERR_CONN_LOST
  toEnum 8    = MOSQ_ERR_TLS
  toEnum 9    = MOSQ_ERR_PAYLOAD_SIZE
  toEnum 10   = MOSQ_ERR_NOT_SUPPORTED
  toEnum 11   = MOSQ_ERR_AUTH
  toEnum 12   = MOSQ_ERR_ACL_DENIED
  toEnum 13   = MOSQ_ERR_UNKNOWN
  toEnum 14   = MOSQ_ERR_ERRNO
  toEnum 15   = MOSQ_ERR_EAI
  toEnum 16   = MOSQ_ERR_PROXY
  fromEnum MOSQ_ERR_CONN_PENDING  = -1
  fromEnum MOSQ_ERR_SUCCESS       = 0
  fromEnum MOSQ_ERR_NOMEM         = 1
  fromEnum MOSQ_ERR_PROTOCOL      = 2
  fromEnum MOSQ_ERR_INVAL         = 3
  fromEnum MOSQ_ERR_NO_CONN       = 4
  fromEnum MOSQ_ERR_CONN_REFUSED  = 5
  fromEnum MOSQ_ERR_NOT_FOUND     = 6
  fromEnum MOSQ_ERR_CONN_LOST     = 7
  fromEnum MOSQ_ERR_TLS           = 8
  fromEnum MOSQ_ERR_PAYLOAD_SIZE  = 9
  fromEnum MOSQ_ERR_NOT_SUPPORTED = 10
  fromEnum MOSQ_ERR_AUTH          = 11
  fromEnum MOSQ_ERR_ACL_DENIED    = 12
  fromEnum MOSQ_ERR_UNKNOWN       = 13
  fromEnum MOSQ_ERR_ERRNO         = 14
  fromEnum MOSQ_ERR_EAI           = 15
  fromEnum MOSQ_ERR_PROXY         = 16