#import <Contacts/Contacts.h>
#import <Foundation/Foundation.h>

int main(int argc, const char *argv[]) {
  @autoreleasepool {
    if (argc != 2) {
      fprintf(stderr, "usage: vcard-contacts-probe <fixture.vcf>\n");
      return 2;
    }

    NSString *fixturePath = [NSString stringWithUTF8String:argv[1]];
    NSData *fixture = [NSData dataWithContentsOfFile:fixturePath];
    if (fixture == nil) {
      fprintf(stderr, "could not read fixture\n");
      return 2;
    }

    NSError *error = nil;
    NSArray<CNContact *> *contacts =
        [CNContactVCardSerialization contactsWithData:fixture error:&error];
    if (contacts == nil || contacts.count != 1) {
      fprintf(stderr, "Contacts parser failed: %s\n",
              error.localizedDescription.UTF8String ?: "unexpected contact count");
      return 1;
    }

    CNContact *contact = contacts.firstObject;
    NSMutableArray<NSString *> *emails = [NSMutableArray array];
    for (CNLabeledValue<NSString *> *value in contact.emailAddresses) {
      [emails addObject:value.value];
    }

    NSMutableArray<NSString *> *phones = [NSMutableArray array];
    for (CNLabeledValue<CNPhoneNumber *> *value in contact.phoneNumbers) {
      [phones addObject:value.value.stringValue];
    }

    NSMutableArray<NSString *> *urls = [NSMutableArray array];
    for (CNLabeledValue<NSString *> *value in contact.urlAddresses) {
      [urls addObject:value.value];
    }

    NSMutableArray<NSDictionary *> *addresses = [NSMutableArray array];
    for (CNLabeledValue<CNPostalAddress *> *value in contact.postalAddresses) {
      CNPostalAddress *address = value.value;
      [addresses addObject:@{
        @"street" : address.street,
        @"city" : address.city,
        @"state" : address.state,
        @"postalCode" : address.postalCode,
        @"country" : address.country,
      }];
    }

    NSDictionary *result = @{
      @"contacts" : @(contacts.count),
      @"givenName" : contact.givenName,
      @"familyName" : contact.familyName,
      @"organizationName" : contact.organizationName,
      @"jobTitle" : contact.jobTitle,
      @"emails" : emails,
      @"phones" : phones,
      @"urls" : urls,
      @"postalAddresses" : addresses,
    };

    NSData *json = [NSJSONSerialization dataWithJSONObject:result
                                                    options:NSJSONWritingSortedKeys
                                                      error:&error];
    if (json == nil) {
      fprintf(stderr, "could not serialize result: %s\n",
              error.localizedDescription.UTF8String);
      return 1;
    }

    fwrite(json.bytes, 1, json.length, stdout);
    fputc('\n', stdout);
    return 0;
  }
}
