import XXClient
import XCTestDynamicOverlay

public struct MessengerCreate {
  public var run: () throws -> Void

  public func callAsFunction() throws {
    try run()
  }
}

extension MessengerCreate {
  public static func live(_ env: MessengerEnvironment) -> MessengerCreate {
    MessengerCreate {
      let ndfData = try env.downloadNDF(env.ndfEnvironment)
      let password = env.generateSecret()
      try env.passwordStorage.save(password)
      let storageDir = env.storageDir
      try env.fileManager.removeDirectory(storageDir)
      try env.fileManager.createDirectory(storageDir)
      try env.newCMix(
        ndfJSON: String(data: ndfData, encoding: .utf8)!,
        storageDir: storageDir,
        password: password,
        registrationCode: nil
      )
    }
  }
}

extension MessengerCreate {
  public static let unimplemented = MessengerCreate(
    run: XCTUnimplemented("\(Self.self)")
  )
}