{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}

module Data.Hadoop.Protobuf.ProtocolInfo where

import Data.ProtocolBuffers
import Data.Text (Text)
import Data.Word (Word32, Word64)
import GHC.Generics (Generic)

------------------------------------------------------------------------

-- | Request to get protocol versions for all supported rpc kinds.
data GetProtocolVersionsRequest = GetProtocolVersionsRequest
    { pvProtocol :: Required 1 (Value Text) -- ^ Protocol name
    } deriving (Generic, Show)

instance Encode GetProtocolVersionsRequest
instance Decode GetProtocolVersionsRequest

-- | Protocol version with corresponding RPC kind.
data ProtocolVersion = ProtocolVersion
    { pvRpcKind  :: Required 1 (Value Text)   -- ^ RPC kind
    , pvVersions :: Repeated 2 (Value Word64) -- ^ Protocol version corresponding to the rpc kind
    } deriving (Generic, Show)

instance Encode ProtocolVersion
instance Decode ProtocolVersion

-- | Get protocol version response.
data GetProtocolVersionsResponse = GetProtocolVersionsResponse
    { pvProtocolVersions :: Repeated 1 (Message ProtocolVersion)
    } deriving (Generic, Show)

instance Encode GetProtocolVersionsResponse
instance Decode GetProtocolVersionsResponse

------------------------------------------------------------------------

-- | Get protocol signature request
data GetProtocolSignatureRequest = GetProtocolSignatureRequest
    { psProtocol :: Required 1 (Value Text) -- ^ Protocol name
    , psRpcKind  :: Required 2 (Value Text) -- ^ RPC kind
    } deriving (Generic, Show)

instance Encode GetProtocolSignatureRequest
instance Decode GetProtocolSignatureRequest

-- | Get protocol signature response
data GetProtocolSignatureResponse = GetProtocolSignatureResponse
    { psSignatures :: Repeated 1 (Message ProtocolSignature)
    } deriving (Generic, Show)

instance Encode GetProtocolSignatureResponse
instance Decode GetProtocolSignatureResponse

data ProtocolSignature = ProtocolSignature
    { psVersion :: Required 1 (Value Word64)
    , psMethods :: Repeated 2 (Value Word32)
    } deriving (Generic, Show)

instance Encode ProtocolSignature
instance Decode ProtocolSignature

------------------------------------------------------------------------

{-
Example Request
===============

    req = RpcRequest
        { reqMethodName      = putField "getProtocolSignature"
        , reqBytes           = putField $ Just $ toBytes GetProtocolSignatureRequest
            { psProtocol = putField "org.apache.hadoop.hdfs.protocol.ClientProtocol"
            , psRpcKind  = putField "RPC_PROTOCOL_BUFFER"
            }
        , reqProtocolName    = putField "org.apache.hadoop.ipc.ProtocolMetaInfoPB"
        , reqProtocolVersion = putField 1
        }

-}