# @vulog/aima-document

User document management — upload, review, and status tracking.

## Installation

```sh
npm install @vulog/aima-document @vulog/aima-client @vulog/aima-core
```

## Usage

```ts
import { getClient } from '@vulog/aima-client';
import { createOrUpdateDocument, getUserDocuments, updateDocumentStatus, deleteDocument } from '@vulog/aima-document';

const client = getClient({ /* client options */ });

const doc = await createOrUpdateDocument(client, 'user-uuid', {
    documentType: 'DRIVING_LICENSE',
    documentNumber: 'AB123456',
});
```

## API Reference

### createOrUpdateDocument

```ts
createOrUpdateDocument(client: Client, userId: string, document: DocumentBody): Promise<DocumentFull>
```

Creates or updates a document for a user. `userId` must be a UUID.

**Params:** `client` — Authenticated AIMA client; `userId` — UUID; `document` — document data including required `documentType`  
**Returns:** `Promise<DocumentFull>`

---

### getUserDocuments

```ts
getUserDocuments(
    client: Client,
    userId: string,
    types?: PersonalInformationDocumentType[]
): Promise<DocumentSummary>
```

Returns all documents for a user. `userId` must be a UUID. `types` currently only supports `'DOCUMENT_NUMBER_1'`.

**Params:** `client` — Authenticated AIMA client; `userId` — UUID; `types` — optional filter  
**Returns:** `Promise<DocumentSummary>`

---

### updateDocumentStatus

```ts
updateDocumentStatus(
    client: Client,
    userId: string,
    documentId: number,
    document: DocumentStatusReview
): Promise<DocumentFull>
```

Updates the review status of a document. `userId` must be a UUID; `documentId` must be a non-negative integer.

**Params:** `client` — Authenticated AIMA client; `userId` — UUID; `documentId` — non-negative integer; `document` — status and reviewer  
**Returns:** `Promise<DocumentFull>`

---

### deleteDocument

```ts
deleteDocument(client: Client, userId: string, documentId: number): Promise<void>
```

Deletes a document. `userId` must be a UUID; `documentId` must be a positive integer.

**Params:** `client` — Authenticated AIMA client; `userId` — UUID; `documentId` — positive integer  
**Returns:** `Promise<void>`

## Types

### DocumentStatus

```ts
type DocumentStatus = 'MISSING' | 'VALID' | 'INVALID' | 'EXPIRED' | 'PENDING_REVIEW';
```

### DocumentFull

```ts
interface DocumentFull {
    id: number;
    fleetId: string;
    userId: string;
    documentType: DocumentType;
    documentNumber?: string;
    expirationDate?: string;
    files: FileUrl[];
    uploadUrls: FileUrl[];
    status: DocumentStatus;
    reviewer?: string;
    issuingCountry?: string;
    issuingOffice?: string;
    issuingDate?: string;
    dlClass?: string;
    issuingSubdivision?: string;
}
```

### DocumentBody

Partial of `DocumentFull` (excluding `id`, `fleetId`, `documentType`, `files`, `uploadUrls`, `status`, `reviewer`) with `documentType: string` as a required field.

### DocumentStatusReview

```ts
interface DocumentStatusReview {
    status: DocumentStatus;
    reviewer: string;
}
```

### DocumentSummary

```ts
interface DocumentSummary {
    documentTypes: DocumentType[];
    documents: DocumentFull[];
    documentByService: DocumentByService[];
    documentByFranchise: DocumentByFranchise[] | null;
}
```

Also exports: `DocumentType`, `FileUrl`, `DocumentByService`, `DocumentByFranchise`, `PersonalInformationDocumentType`, `PersonalInformationDocument`.
