import Bindings

public struct ContactFactsSetter {
  public var set: (Data, [Fact]) throws -> Data

  public func callAsFunction(
    contact: Data,
    facts: [Fact]
  ) throws -> Data {
    try set(contact, facts)
  }
}

extension ContactFactsSetter {
  public static let live = ContactFactsSetter { contact, facts in
    let encoder = JSONEncoder()
    let factsData = try encoder.encode(facts)
    var error: NSError?
    let updatedContact = BindingsSetFactsOnContact(contact, factsData, &error)
    if let error = error {
      throw error
    }
    guard let updatedContact = updatedContact else {
      fatalError("BindingsSetFactsOnContact returned `nil` without providing error")
    }
    return updatedContact
  }
}

#if DEBUG
extension ContactFactsSetter {
  public static let failing = ContactFactsSetter { _, _ in
    struct NotImplemented: Error {}
    throw NotImplemented()
  }
}
#endif