{-|
Module      : Network.Nakadi.Lenses
Description : Nakadi Client Library Lenses (Internal)
Copyright   : (c) Moritz Clasmeier 2017, 2018
License     : BSD3
Maintainer  : mtesseract@silverratio.net
Stability   : experimental
Portability : POSIX

This module implements lenses for the data types contained in this
package.
-}

{-# OPTIONS_HADDOCK prune           #-}

{-# LANGUAGE DataKinds              #-}
{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE TemplateHaskell        #-}

module Network.Nakadi.Internal.Lenses where

import           Network.Nakadi.Internal.Prelude

import           Control.Lens
import           Data.Text                      ( Text )
import           Data.Time.Clock
import           Data.UUID                      ( UUID )
import           Network.Nakadi.Internal.TH

import           Network.Nakadi.Internal.Types.Committer
import           Network.Nakadi.Internal.Types.Config
import           Network.Nakadi.Internal.Types.Service
import           Network.Nakadi.Internal.Types.Worker

makeNakadiLenses ''Config
makeNakadiLenses ''SubscriptionStatsConf
makeNakadiLenses ''HttpBackend
makeNakadiLenses ''Cursor
makeNakadiLenses ''DataChangeEvent
makeNakadiLenses ''DataChangeEventEnriched
makeNakadiLenses ''BusinessEvent
makeNakadiLenses ''BusinessEventEnriched
makeNakadiLenses ''SubscriptionEventStreamBatch
makeNakadiLenses ''EventMetadata
makeNakadiLenses ''EventMetadataEnriched
makeNakadiLenses ''Partition
makeNakadiLenses ''PartitionStat
makeNakadiLenses ''CursorDistanceQuery
makeNakadiLenses ''CursorDistanceResult
makeNakadiLenses ''Timestamp
makeNakadiLenses ''SubscriptionEventStream
makeNakadiLenses ''EventTypeSchema
makeNakadiLenses ''EventType
makeNakadiLenses ''EventTypeSchemasResponse
makeNakadiLenses ''PaginationLink
makeNakadiLenses ''PaginationLinks
makeNakadiLenses ''SubscriptionStats
makeNakadiLenses ''SubscriptionCursorCommit
makeNakadiLenses ''SubscriptionCursor
makeNakadiLenses ''CursorCommit
makeNakadiLenses ''SubscriptionsListResponse
makeNakadiLenses ''Subscription
makeNakadiLenses ''WorkerConfig
makeNakadiLenses ''Worker
makeNakadiLenses ''WorkerRegistry
makeNakadiLenses ''SubscriptionRequest
makeNakadiLenses ''SubscriptionCursorWithCounter

instance HasNakadiId StreamId Text where
  id f (StreamId a) = StreamId <$> f a

instance HasNakadiId SubscriptionId UUID where
  id f (SubscriptionId a) = SubscriptionId <$> f a

instance HasNakadiId EventId UUID where
  id f (EventId a) = EventId <$> f a

class HasNakadiUTCTime s a where
  utcTime :: Lens' s a

instance HasNakadiUTCTime Timestamp UTCTime where
  utcTime f (Timestamp t) = Timestamp <$> f t

class HasNakadiSubscriptionCursor s where
  subscriptionCursor :: Getter s SubscriptionCursor

instance HasNakadiSubscriptionCursor SubscriptionCursor where
  subscriptionCursor = identity

instance HasNakadiSubscriptionCursor (SubscriptionEventStreamBatch a) where
  subscriptionCursor = cursor