-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | Runtime environment for @morley-client@.

module Morley.Client.Env
  ( MorleyClientEnv' (..)

  -- * Lens
  , mceTezosClientL
  , mceLogActionL
  , mceSecretKeyL
  , mceClientEnvL
  ) where

import Control.Lens (lens)
import Morley.Util.Lens (makeLensesWith, postfixLFields)
import Servant.Client (ClientEnv)

import Morley.Tezos.Crypto.Ed25519 qualified as Ed25519

import Morley.Client.Logging (ClientLogAction)
import Morley.Client.TezosClient.Types

-- | Runtime environment for morley client.
data MorleyClientEnv' m = MorleyClientEnv
  { MorleyClientEnv' m -> TezosClientEnv
mceTezosClient :: TezosClientEnv
  -- ^ Environment for @tezos-client@.
  , MorleyClientEnv' m -> ClientLogAction m
mceLogAction :: ClientLogAction m
  -- ^ Action used to log messages.
  , MorleyClientEnv' m -> Maybe SecretKey
mceSecretKey :: Maybe Ed25519.SecretKey
  -- ^ Pass if you want to sign operations manually or leave it
  -- to tezos-client
  , MorleyClientEnv' m -> ClientEnv
mceClientEnv :: ClientEnv
  -- ^ Environment necessary to make HTTP calls.
  }

makeLensesWith postfixLFields ''MorleyClientEnv'

instance HasTezosClientEnv (MorleyClientEnv' m) where
  tezosClientEnvL :: (TezosClientEnv -> f TezosClientEnv)
-> MorleyClientEnv' m -> f (MorleyClientEnv' m)
tezosClientEnvL =
    (MorleyClientEnv' m -> TezosClientEnv)
-> (MorleyClientEnv' m -> TezosClientEnv -> MorleyClientEnv' m)
-> Lens' (MorleyClientEnv' m) TezosClientEnv
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens MorleyClientEnv' m -> TezosClientEnv
forall (m :: * -> *). MorleyClientEnv' m -> TezosClientEnv
mceTezosClient (\MorleyClientEnv' m
mce TezosClientEnv
tce -> MorleyClientEnv' m
mce { mceTezosClient :: TezosClientEnv
mceTezosClient = TezosClientEnv
tce })