# Labels & Addresses

## Labels

Label (category/folder) management via `/core/v4/labels`.

### Operations

```go
// Fetch labels filtered by type(s)
labels, err := c.GetLabels(ctx, proton.LabelLabel, proton.LabelFolder)

// Find a specific label by ID
label, err := c.GetLabel(ctx, labelID, proton.LabelLabel)

// Create a label
label, err := c.CreateLabel(ctx, proton.CreateLabelReq{
    Name:   "Personal",
    Color:  "#ff0000",
    Type:   proton.LabelLabel,
    Parent: parentID,
})

// Update a label
err := c.UpdateLabel(ctx, labelID, proton.UpdateLabelReq{
    Name: "Updated Name",
    Color: "#00ff00",
})

// Delete a label
err := c.DeleteLabel(ctx, labelID)
```

### System Label Constants

| Constant | ID | Description |
|---|---|---|
| `InboxLabel` | "0" | Inbox |
| `AllSentLabel` | "2" | All Sent |
| `TrashLabel` | "3" | Trash |
| `SpamLabel` | "4" | Spam |
| `AllMailLabel` | "5" | All Mail |
| `StarredLabel` | "10" | Starred |

## Email Addresses

Email address management via `/core/v4/addresses`.

### Operations

```go
// List addresses (sorted by order)
addresses, err := c.GetAddresses(ctx)

// Get a single address
addr, err := c.GetAddress(ctx, addressID)

// Reorder addresses
err := c.OrderAddresses(ctx, proton.OrderAddressesReq{...})

// Enable/disable address
err := c.EnableAddress(ctx, addressID)
err := c.DisableAddress(ctx, addressID)

// Delete address
err := c.DeleteAddress(ctx, addressID)
```

### Address Types

| Type | Description |
|---|---|
| `Original` | Original Proton address |
| `Alias` | Proton alias |
| `Custom` | Custom domain address |
| `Premium` | Premium address |
| `External` | Bring Your Own Email (BYOE) |

### BYOE Detection

```go
if addr.IsBYOEAddress() {
    // External type with sending enabled
}
```

## Key Types

| Type | Description |
|---|---|
| `Label` | ID, parentID, name, path ([]string), color, type |
| `LabelType` | Label, ContactGroup, Folder, System |
| `Address` | ID, email, send/receive flags, status, type, order, display name, keys |
| `AddressStatus` | Disabled, enabled, deleting |
| `AddressType` | Original, alias, custom, premium, external |

## Path Handling

The API sends label path as a string (e.g., `"Inbox/SubFolder"`), which is split into a `[]string` slice for Go use, with custom `MarshalJSON`/`UnmarshalJSON`.