import Contacts

/// Service for saving vCard data to the user's Contacts.
struct ContactSaveService: Sendable {

    /// Saves the vCard data as a new contact.
    /// - Parameter vCardData: The vCard string to parse and save.
    func saveContact(vCardData: String) async throws {
        let store = CNContactStore()

        let authorized = try await store.requestAccess(for: .contacts)
        guard authorized else {
            throw ClipError.contactsAccessDenied
        }

        guard let data = vCardData.data(using: .utf8),
              let contact = try CNContactVCardSerialization.contacts(with: data).first else {
            throw ClipError.invalidRecord
        }

        let mutableContact = contact.mutableCopy() as? CNMutableContact ?? CNMutableContact()
        let saveRequest = CNSaveRequest()
        saveRequest.add(mutableContact, toContainerWithIdentifier: nil)

        do {
            try store.execute(saveRequest)
        } catch {
            throw ClipError.contactSaveFailed
        }
    }
}
