

import { Provider, ProviderCredential } from '../data-structures/provider'

import {
  PROVIDER_TYPE_DATABASE,
  PROVIDER_TYPE_ASYMMETRIC_CRYPTOGRAPHY,
  PROVIDER_TYPE_HASH_FUNCTION
  // PROVIDER_TYPE_DISTRIBUTED_LEDGER_TECHNOLOGY,
  // PROVIDER_TYPE_PROCESS_RUNNER,
  // PROVIDER_TYPE_FILE_SYSTEM
  // PROVIDER_TYPE_TEXT_SEARCH
} from '../constants/provider'

import { AsymmetricCryptographyMultiplexer } from '../data-structures/asymmetric-cryptography'
import { DatabaseMultiplexer } from '../data-structures/database'
import { HashFunctionMultiplexer } from '../data-structures/hash-function'

import { getMultiplexer as getAsymmetricCryptographyMultiplexer  } from '../algorithms/asymmetric-cryptography/get-multiplexer'
import { getMultiplexer as getDatabaseMultiplexer } from '../algorithms/database/get-multiplexer'
import { getMultiplexer as getHashFunctionMultiplexer } from '../algorithms/hash-function/get-multiplexer'

const providerTable: { [providerNameVersionId: string]: Provider } = {}

const providerTypeTable: {
  [providerType: string]: {
    table: { [providerNameVersionId: string]: boolean }
    list: string[]
  }
} = {}

const providerCredentialTable: { [credentialHashId: string]: ProviderCredential } = {}

const multiplexerTable: {
  [PROVIDER_TYPE_ASYMMETRIC_CRYPTOGRAPHY]: AsymmetricCryptographyMultiplexer,
  [PROVIDER_TYPE_DATABASE]: DatabaseMultiplexer,
  // [PROVIDER_TYPE_COMPUTER_SERVICE]: ComputerServiceMultiplexer,
  // [PROVIDER_TYPE_DISTRIBUTED_LEDGER_TECHNOLOGY]: DistributedLedgerTechnologyMultiplexer,
  [PROVIDER_TYPE_HASH_FUNCTION]: HashFunctionMultiplexer
  // [PROVIDER_TYPE_FILE_SYSTEM]: FileSystemMultiplexer,
  // [PROVIDER_TYPE_TEXT_SEARCH]: TextSearchMultiplexer
} = {
  [PROVIDER_TYPE_ASYMMETRIC_CRYPTOGRAPHY]: getAsymmetricCryptographyMultiplexer(),
  [PROVIDER_TYPE_DATABASE]: getDatabaseMultiplexer(),
  [PROVIDER_TYPE_HASH_FUNCTION]: getHashFunctionMultiplexer()
}

export {
  providerTable,
  providerTypeTable,
  providerCredentialTable,
  multiplexerTable
}

