import Bindings

public struct CmixManager {
  public var hasStorage: CmixManagerHasStorage
  public var create: CmixManagerCreate
  public var load: CmixManagerLoad
  public var remove: CmixManagerRemove
}

extension CmixManager {
  public static func live(
    directoryPath: String = FileManager.default
      .urls(for: .applicationSupportDirectory, in: .userDomainMask)
      .first!
      .appendingPathComponent("xx.network.client")
      .path,
    fileManager: FileManager = .default,
    environment: Environment = .mainnet,
    downloadNDF: DownloadAndVerifySignedNdf = .live,
    generateSecret: GenerateSecret = .live,
    passwordStorage: PasswordStorage,
    newCmix: NewCmix = .live,
    getCmixParams: GetCmixParams = .liveDefault,
    loadCmix: LoadCmix = .live
  ) -> CmixManager {
    CmixManager(
      hasStorage: .live(
        directoryPath: directoryPath,
        fileManager: fileManager
      ),
      create: .live(
        environment: environment,
        downloadNDF: downloadNDF,
        generateSecret: generateSecret,
        passwordStorage: passwordStorage,
        directoryPath: directoryPath,
        fileManager: fileManager,
        newCmix: newCmix,
        getCmixParams: getCmixParams,
        loadCmix: loadCmix
      ),
      load: .live(
        directoryPath: directoryPath,
        passwordStorage: passwordStorage,
        getCmixParams: getCmixParams,
        loadCmix: loadCmix
      ),
      remove: .live(
        directoryPath: directoryPath,
        fileManager: fileManager
      )
    )
  }
}

extension CmixManager {
  public static let unimplemented = CmixManager(
    hasStorage: .unimplemented,
    create: .unimplemented,
    load: .unimplemented,
    remove: .unimplemented
  )
}