module arch.node.types.anoma_environment;

import prelude open;

{- Identity -}

import arch.node.engines.identity_management_environment open;
import arch.node.engines.decryption_environment open;
import arch.node.engines.encryption_environment open;
import arch.node.engines.commitment_environment open;

import arch.node.engines.verification_environment open;
import arch.node.engines.reads_for_environment open;
import arch.node.engines.signs_for_environment open;
import arch.node.engines.naming_environment open;

import arch.node.engines.local_key_value_storage_environment open;
import arch.node.engines.logging_environment open;
import arch.node.engines.wall_clock_environment open;
import arch.node.engines.local_time_series_storage_environment open;

{- Network -}

import arch.node.engines.net_registry_environment open;
import arch.node.engines.router_environment open;
import arch.node.engines.transport_protocol_environment open;
import arch.node.engines.transport_connection_environment open;
import arch.node.engines.pub_sub_topic_environment open;
import arch.node.engines.storage_environment open;

{- Ordering -}

import arch.node.engines.mempool_worker_environment open;
import arch.node.engines.executor_environment open;
import arch.node.engines.shard_environment open;

{- Misc -}

import arch.node.engines.ticker_environment open;

{- Templates -}

import tutorial.engines.template_environment open;
import tutorial.engines.template_minimum_environment open;

-- Add imports here
type PreEnv KVSKey KVSDatum Executable ProgramState :=
  
  {- Identity -}

  | EnvIdentityManagement IdentityManagementEnv
  | EnvDecryption DecryptionEnv
  | EnvEncryption EncryptionEnv
  | EnvCommitment CommitmentEnv

  | EnvVerification VerificationEnv
  | EnvReadsFor ReadsForEnv
  | EnvSignsFor SignsForEnv
  | EnvNaming NamingEnv

  {- Hardware -}

  | EnvLocalKeyValueStorage LocalKVStorageEnv
  | EnvLogging LoggingEnv
  | EnvWallClock WallClockEnv
  | EnvLocalTSeries LocalTSStorageEnv

  {- Network -}

  | EnvRouter RouterEnv
  | EnvTransportProtocol TransportProtocolEnv
  | EnvTransportConnection TransportConnectionEnv
  | EnvPubSubTopic PubSubTopicEnv
  | EnvStorage StorageEnv

  {- Ordering -}

  | EnvMempoolWorker (MempoolWorkerEnv KVSKey KVSDatum Executable)
  | EnvExecutor (ExecutorEnv KVSKey KVSDatum ProgramState)
  | EnvShard (ShardEnv KVSKey KVSDatum)

  {- Misc -}

  | EnvTicker TickerEnv

  {- Templates -}

  | EnvTemplate TemplateEnv
  | EnvTemplateMinimum TemplateMinimumEnv;

-- Add more environments here

Env : Type := PreEnv String String ByteString String;