import Bindings
import XCTestDynamicOverlay

public struct ResumeBackup {
  public var run: (Int, Int, UpdateBackupFunc) throws -> Backup

  public func callAsFunction(
    e2eId: Int,
    udId: Int,
    callback: UpdateBackupFunc
  ) throws -> Backup {
    try run(e2eId, udId, callback)
  }
}

extension ResumeBackup {
  public static let live = ResumeBackup { e2eId, udId, callback in
    var error: NSError?
    let bindingsBackup = BindingsResumeBackup(
      e2eId,
      udId,
      callback.makeBindingsUpdateBackupFunc(),
      &error
    )
    if let error = error {
      throw error
    }
    guard let bindingsBackup = bindingsBackup else {
      fatalError("BindingsResumeBackup returned `nil` without providing error")
    }
    return .live(bindingsBackup)
  }
}

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