{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DataKinds     #-}
--------------------------------------------------------------------------------
-- |
-- Module : Database.EventStore.Internal.Operation.WriteEvents.Message
-- Copyright : (C) 2015 Yorick Laupa
-- License : (see the file LICENSE)
--
-- Maintainer : Yorick Laupa <yo.eight@gmail.com>
-- Stability : provisional
-- Portability : non-portable
--
--------------------------------------------------------------------------------
module Database.EventStore.Internal.Operation.WriteEvents.Message where

--------------------------------------------------------------------------------
import Data.Int

--------------------------------------------------------------------------------
import Data.ProtocolBuffers

--------------------------------------------------------------------------------
import Database.EventStore.Internal.Operation
import Database.EventStore.Internal.Prelude
import Database.EventStore.Internal.Types

--------------------------------------------------------------------------------
-- | Write events request.
data Request
    = Request
      { _streamId        :: Required 1 (Value Text)
      , _expectedVersion :: Required 2 (Value Int64)
      , _events          :: Repeated 3 (Message NewEvent)
      , _requireMaster   :: Required 4 (Value Bool)
      }
    deriving (Generic, Show)

--------------------------------------------------------------------------------
instance Encode Request

--------------------------------------------------------------------------------
-- | 'Request' smart constructor.
newRequest :: Text        -- ^ Stream
           -> Int64       -- ^ Expected version
           -> [NewEvent]  -- ^ Events
           -> Bool        -- ^ Require master
           -> Request
newRequest stream_id exp_ver evts req_master =
    Request
    { _streamId        = putField stream_id
    , _expectedVersion = putField exp_ver
    , _events          = putField evts
    , _requireMaster   = putField req_master
    }

--------------------------------------------------------------------------------
-- | Write events response.
data Response
    = Response
      { _result          :: Required 1 (Enumeration OpResult)
      , _message         :: Optional 2 (Value Text)
      , _firstNumber     :: Required 3 (Value Int64)
      , _lastNumber      :: Required 4 (Value Int64)
      , _preparePosition :: Optional 5 (Value Int64)
      , _commitPosition  :: Optional 6 (Value Int64)
      }
    deriving (Generic, Show)

--------------------------------------------------------------------------------
instance Decode Response