# Contacts

## Contacts

CRUD operations for contacts and contact emails via `/contacts/v4`.

## Operations

### Get Contacts

```go
// Single contact by ID
contact, err := c.GetContact(ctx, contactID)

// Count contacts
count, err := c.CountContacts(ctx)

// Paginated listing
contacts, err := c.GetContacts(ctx, page, pageSize)

// Auto-paginating - get all
allContacts, err := c.GetAllContacts(ctx)

// Auto-paginating with custom page size
allContacts, err := c.GetAllContactsPaged(ctx, pageSize)
```

### Search by Email

```go
// Count matches
count, err := c.CountContactEmails(ctx, "user@example.com")

// Paginated search
emails, err := c.GetContactEmails(ctx, "user@example.com", page, pageSize)

// Get all matching
allEmails, err := c.GetAllContactEmails(ctx, "user@example.com")
```

### Create / Update / Delete

```go
// Bulk create with overwrite and label options
results, err := c.CreateContacts(ctx, proton.CreateContactsReq{
    Contacts: []proton.Contact{
        {
            Cards: []proton.ContactCard{...},
            Email: "user@example.com",
        },
    },
})

// Update a contact
updated, err := c.UpdateContact(ctx, contactID, proton.UpdateContactReq{
    Cards: []proton.ContactCard{...},
})

// Bulk delete
err := c.DeleteContacts(ctx, proton.DeleteContactsReq{
    IDs: []string{id1, id2},
})
```

## Per-Contact Encryption Preferences

Contact settings are stored as VCard-embedded X-PM-* fields:

```go
// Get encryption settings for a contact
settings := contact.GetSettings()
// Returns: MIME type, PGP scheme (inline/MIME), sign/encrypt flags, PGP keys

// Set encryption settings
contact.SetSettings(proton.ContactSettings{
    MIMEType:       "text/plain",
    Scheme:         proton.PGPMIMEScheme,
    Sign:           true,
    Encrypt:        true,
    EncryptUntrusted: true,
    PGPKeys:        []proton.PGPKey{...},
})
```

## Key Types

| Type | Description |
|---|---|
| `Contact` | Composite of ContactMetadata and ContactCards |
| `ContactMetadata` | ID, name, UID, size, timestamps, emails, labels |
| `ContactCards` | VCard data for the contact |
| `ContactEmail` | Email entry with ID, name, email string, type tags, contactID, labels |
| `ContactSettings` | Per-contact encryption preferences (MIME type, scheme, sign/encrypt flags, PGP keys) |
| `RecipientType` | Internal vs external recipient classification |